我正在尝试确定进程挂起的原因,并且正在学习各种工具,例如 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 正在附加到我的进程,然后立即 splinter 。然后,当我进行分析时,它认为断点(它刚刚设置的)是应用程序的问题?
我应该如何使用 WinDbg 来简单地附加到进程并对其进行分析?
(此外,是否有任何好的书籍/教程可帮助您开始使用此级别的调试和 WinDbg?)
最佳答案
WinDbg 是一个用户和内核模式调试器,但它本身并不能真正理解托管代码,因此 !analyze
命令的用途有限。如果你想使用 WinDbg 调试托管应用程序,你需要一些方法让 WinDbg 理解托管代码的内部结构。有许多扩展 DLL 可以实现这一点。 .NET Framework 附带 sos.dll,并且可以下载 psscor2.dll。和 sosex.dll .
SOS 和 PSSCOR2 提供或多或少相同的功能,而 SOSEX 为托管调试添加了新功能。这些文件的帮助文件都可以从 WinDbg 获得。例如。要获得 SOS 的帮助,您可以使用 !sos.help
命令。
您必须加载 SOS 或 PSSCOR2 以及可能的 SOSEX 才能使用 WinDbg 调试托管应用程序。例如。如果你想加载 SOS,你可以使用这样的加载命令
.loadby sos clr
这将从 .NET 运行时的位置加载 SOS。请注意,运行时在 .NET 2 中称为 mscorwks
,在 Silverlight 中称为 coreclr
,因此如果您使用其中任何一个,则需要更改 。相应地加载
命令。
WinDbg 需要符号来显示附加信息。这对于非托管代码尤为重要。您可以使用 .symfix
命令让 WinDbg 根据需要从 Microsoft 的符号服务器中检索符号。
当您的应用程序挂起时,您很可能会有一个或多个线程被阻塞。您可以使用 !threads
(或只是 !t
)命令查看托管线程。在 .NET 中,简单的锁是使用称为 SyncBlocks 的结构在内部实现的。您可以使用 !syncblk
命令查看这些内容。如果您加载了 SOSEX,!dlk
命令可以自动检测死锁。
如果您想了解更多信息,可以阅读几本书和一些博客。
书籍:
- Advanced .NET Debugging作者:马里奥·赫沃特。还有一本关于 native debugging 的书来自同一作者。
- Debugging Microsoft .NET 2.0 Applications通过约翰·罗宾斯
- CLR via C# Jeffrey Richter 对 CLR 的内部结构进行了出色的介绍。
博客:
- Tess' blog是很棒的。它有许多教程和实验可供您练习。
- Tom's blog也很有用。
视频:
关于windows - 我如何学习 WinDbg? (关于 : seemingly simple hung process),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961692/