我试图确定进程为什么挂起,并且正在学习各种工具,例如Process Explorer,Process Monitor和WinDbg。
无论如何,我试图使用WinDbg,并且在附加到我的进程之后,调试器会这样说:
(1e9c.1128): Break instruction exception - code 80000003 (first chance)
eax=7ffda000 ebx=00000000 ecx=00000000 edx=77c5c964 esi=00000000 edi=00000000
eip=77c18b2e esp=0543ff5c ebp=0543ff88 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!DbgBreakPoint:
77c18b2e cc int 3
如果我运行
!analyze -v
,它将显示以下内容:FAULTING_IP:
ntdll!DbgBreakPoint+0
77c18b2e cc int 3
我是一位软件开发人员(VB.NET/C#),在此级别的调试中没有经验,所以我不确定自己在做什么,但似乎WinDbg会附加到我的过程中,然后立即中断。然后,当我进行分析时,它认为断点(刚设置的断点)是应用程序的问题吗?
我应该如何使用WinDbg简单地附加到进程并对其进行分析?
(此外,对于这种级别的调试和WinDbg,是否有任何入门的好书/教程?)
最佳答案
WinDbg是用户和内核模式调试器,但单靠它并不能真正理解托管代码,因此!analyze
命令的使用受到限制。如果要使用WinDbg调试托管应用程序,则需要某种方式使WinDbg了解托管代码的内部结构。有许多扩展DLL可以启用此功能。 .NET框架随sos.dll一起提供,并且有诸如psscor2.dll和sosex.dll之类的下载。
SOS和PSSCOR2提供或多或少的相同功能,而SOSEX添加了新功能来进行托管调试。 WinDbg提供了有关这些文件的帮助文件。例如。要获得SOS的帮助,可以使用!sos.help
命令。
您必须加载SOS或PSSCOR2,并可能加载SOSEX才能使用WinDbg调试托管应用程序。例如。如果您想加载SOS,请使用如下所示的load命令.loadby sos clr
这将从.NET运行时的位置加载SOS。请注意,运行时在.NET 2中称为mscorwks
,在Silverlight中称为coreclr
,因此,如果您使用这两种方法,则需要相应地更改.loadby
命令。
WinDbg需要使用符号来显示其他信息。这对于非托管代码特别重要。您可以使用.symfix
命令让WinDbg根据需要从Microsoft的符号服务器中检索符号。
当您的应用程序挂起时,很有可能会有一个或多个阻塞线程。您可以使用!threads
(或仅!t
)命令查看托管线程。在.NET中,简单锁是使用称为SyncBlocks的结构在内部实现的。您可以使用!syncblk
命令查看这些内容。如果已加载SOSEX,则!dlk
命令可以自动检测死锁。
如果您想了解更多信息,可以阅读一些书籍和一些博客。
图书:
Mario Hewardt的
博客:
影片:
关于windows - 如何学习WinDbg? (re : seemingly simple hung process),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3961692/