我正在尝试确定流程悬而未决的原因,并且正在学习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的好书/教程?)
答案 0 :(得分:9)
WinDbg是一个用户和内核模式调试器,但它本身并不真正理解托管代码,因此!analyze
命令的用途有限。如果要使用WinDbg调试托管应用程序,则需要一些方法使WinDbg了解托管代码的内部结构。有许多扩展DLL可以实现这一点。 .NET框架附带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
,因此如果您正在使用其中任何一个,则需要相应地更改.loadby
命令。
WinDbg需要符号才能显示其他信息。这对于非托管代码尤为重要。您可以使用.symfix
命令让WinDbg根据需要从Microsoft的符号服务器中检索符号。
当您的应用程序挂起时,您很可能会有一个或多个被阻止的线程。您可以使用!threads
(或仅!t
)命令查看托管线程。在.NET中,使用名为SyncBlocks的结构在内部实现简单锁。您可以使用!syncblk
命令查看这些内容。如果已加载SOSEX,则!dlk
命令可以自动检测死锁。
如果您想了解更多信息,可以阅读几本书和一些博客。
书籍:
博客:
视频:
答案 1 :(得分:5)
Tess Ferrandez的博客是.NET WinDbg材料的绝佳资源:
尽管她的许多文章都针对IIS / ASP.NET工作进程崩溃,挂起和泄漏,但大多数技术都可以应用于各种场景。
答案 2 :(得分:5)
Advanced Windows Debugging将是一个良好的开端。
当Windbg附加到进程时,它会注入一个调用DbgBreakPoint的线程。这就是你所看到的。您可以使用〜来查看正在运行的线程,然后使用~n切换到不同的线程。 k将为您提供当前线程的堆栈跟踪,这应该可以让您了解挂起。
答案 3 :(得分:3)
int 3指令(cc为二进制)是调试器在应用程序中设置断点的方式之一。该指令产生一个中断,暂停程序的执行,并为调试器提供对该中断作出反应的机会。您只需选择继续执行,直到您的程序挂起。