Windows 如何学习WinDbg?(关于:看似简单的挂起过程)

Windows 如何学习WinDbg?(关于:看似简单的挂起过程),windows,debugging,windbg,Windows,Debugging,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=0543f

我正在尝试确定流程挂起的原因,并正在学习各种工具,如、和

无论如何,我正在尝试使用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
如果我运行
!分析-v
,它显示以下内容:

FAULTING_IP: 
ntdll!DbgBreakPoint+0
77c18b2e cc              int     3
我是一名软件开发人员(VB.NET/C#),在这一级别的调试方面没有经验,因此我不确定自己在做什么,但看起来WinDbg似乎正在连接到我的进程,然后立即中断。然后,当我进行分析时,它认为断点(它刚刚设置的断点)是应用程序的问题

我应该如何使用WinDbg简单地连接到一个进程并对其进行分析


(还有,有没有什么好书/教程可以帮助您开始这一级别的调试和WinDbg?

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

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

将是一个良好的开端


当Windbg连接到进程时,它会注入一个调用DbgBreakPoint的线程。这就是你所看到的。您可以使用~查看正在运行的线程,然后使用~n切换到其他线程。k将为您提供当前线程的堆栈跟踪,这将使您对挂起有所了解。

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

WinDbg是一个用户和内核模式调试器,但它本身并不真正理解托管代码,因此也不理解
!analyze
命令使用有限。如果要使用WinDbg调试托管应用程序,则需要某种方法使WinDbg了解托管代码的内部结构。有许多扩展DLL支持此功能。.NET framework附带sos.dll,并提供和等下载

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

您必须加载SOS或PSSCOR2,可能还需要加载SOSEX,才能使用WinDbg调试托管应用程序。例如,如果要加载SOS,请使用如下加载命令

.loadby sos clr

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

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

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

如果你想要更多的信息,这里有几本书和一些博客可以读

书籍:

  • 马里奥·赫瓦特。还有一本书是同一位作者写的
  • 约翰·罗宾斯
  • 杰弗里·里克特(Jeffrey Richter)出色地介绍了CLR的内部结构
博客:

  • 太好了。它有许多教程和实验室,你可以用来练习
  • 也很有用
视频:

  • 我在丹麦的微软开发中心做了一个关于托管调试的演示。视频可在p频道观看。和