我试图确定进程为什么挂起,并且正在学习各种工具,例如Process ExplorerProcess MonitorWinDbg

无论如何,我试图使用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.dllsosex.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的

  • Advanced .NET Debugging。同一位作者还有一本关于native debugging的书。
  • Debugging Microsoft .NET 2.0 Applications,约翰·罗宾斯(John Robbins)
  • Jeffrey Richter的
  • CLR via C#是对CLR内部原理的出色介绍。

  • 博客:
  • Tess' blog很棒。它包含许多您可以用来练习的教程和实验。
  • Tom's blog也非常有用。

  • 影片:
  • 我在丹麦的Microsoft开发中心做了有关托管调试的演示。视频在 channel p上可用。 Part 1part 2
  • 关于windows - 如何学习WinDbg? (re : seemingly simple hung process),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3961692/

    10-16 06:34