我怎样才能学习WinDbg? (重新:看似简单的挂起过程)

时间:2010-10-18 17:30:26

标签: windows debugging windbg

我正在尝试确定流程悬而未决的原因,并且正在学习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的好书/教程?)

4 个答案:

答案 0 :(得分:9)

WinDbg是一个用户和内核模式调试器,但它本身并不真正理解托管代码,因此!analyze命令的用途有限。如果要使用WinDbg调试托管应用程序,则需要一些方法使WinDbg了解托管代码的内部结构。有许多扩展DLL可以实现这一点。 .NET框架附带sos.dll,有psscor2.dllsosex.dll等下载。

SOS和PSSCOR2提供或多或少相同的功能,而SOSEX为管理调试添加了新功能。可以使用WinDbg获得每个文件的帮助文件。例如。要获得SOS的帮助,您可以使用!sos.help命令。

您必须加载SOS或PSSCOR2以及可能的SOSEX才能使用WinDbg调试托管应用程序。例如。如果你想加载SOS,你可以像这样使用加载命令

.loadby sos clr

这将从.NET运行时的位置加载SOS。请注意,运行时在.NET 2中称为mscorwks,在Silverlight中称为coreclr,因此如果您正在使用其中任何一个,则需要相应地更改.loadby命令。

WinDbg需要符号才能显示其他信息。这对于非托管代码尤为重要。您可以使用.symfix命令让WinDbg根据需要从Microsoft的符号服务器中检索符号。

当您的应用程序挂起时,您很可能会有一个或多个被阻止的线程。您可以使用!threads(或仅!t)命令查看托管线程。在.NET中,使用名为SyncBlocks的结构在内部实现简单锁。您可以使用!syncblk命令查看这些内容。如果已加载SOSEX,则!dlk命令可以自动检测死锁。

如果您想了解更多信息,可以阅读几本书和一些博客。

书籍:

博客:

视频:

  • 我在丹麦的Microsoft开发中心做了有关管理调试的演讲。频道可在频道p上找到。 Part 1part 2

答案 1 :(得分:5)

Tess Ferrandez的博客是.NET WinDbg材料的绝佳资源:

  

If broken it is, fix it you should

尽管她的许多文章都针对IIS / ASP.NET工作进程崩溃,挂起和泄漏,但大多数技术都可以应用于各种场景。

答案 2 :(得分:5)

Advanced Windows Debugging将是一个良好的开端。

当Windbg附加到进程时,它会注入一个调用DbgBreakPoint的线程。这就是你所看到的。您可以使用〜来查看正在运行的线程,然后使用~n切换到不同的线程。 k将为您提供当前线程的堆栈跟踪,这应该可以让您了解挂起。

答案 3 :(得分:3)

int 3指令(cc为二进制)是调试器在应用程序中设置断点的方式之一。该指令产生一个中断,暂停程序的执行,并为调试器提供对该中断作出反应的机会。您只需选择继续执行,直到您的程序挂起。