windows - 我如何学习 WinDbg? (关于 : seemingly simple hung process)

标签 windows debugging windbg

我正在尝试确定进程挂起的原因,并且正在学习各种工具,例如 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 命令可以自动检测死锁。

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

书籍:

博客:

视频:

  • 我在丹麦的 Microsoft 开发中心做了一个关于托管调试的演示。视频可在 channel p 上找到。 Part 1part 2 .

关于windows - 我如何学习 WinDbg? (关于 : seemingly simple hung process),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961692/

相关文章:

windows - 适用于 Windows 的 PECL OAuth-1.2.2

c++ - 访问硬盘的未分配空间

django - 如何在 Django 中打印发布请求数据

.net - 如何在WinDbg中查看.NET并发集合?

process - 将 WinDbg 附加到进程

windows - 使用批处理脚本从文本文件中删除多行字符串

c# - 自动播放处理程序 : wrong clipboard format?

debugging - 英特尔AT&T汇编程序的分步执行?

iOS - 如何获取有关 nil 返回值的更多调试信息

.net - 如何从带有procdump(或类似文件)的.Net应用程序中捕获未处理的异常?