在发布版本中获取没有 pdb 文件的所有线程的堆栈跟踪

Get stack trace of all threads without pdb files in Release build

我有一个 运行ning C# 应用程序陷入了某种死锁,我想获取所有 运行ning 线程的堆栈跟踪以分析问题。不幸的是,这个应用程序是一个发布版本,我丢失了 pdb 个文件。

当我附加 VS2013 调试器(通过远程调试)时,我可以看到线程列表,但看不到任何堆栈跟踪。堆栈跟踪 window 仅包含每个线程的 "External code"。

如果能看到基本的堆栈跟踪会很有帮助 - 我不关心行号等细节。

更新 我实际上已经观察到,只要我 运行 发布配置(远程主机 运行 与 VS 中的构建完全相同,并且 PDB 可用),我就会遇到完全相同的问题。我只能在调试版本中看到堆栈跟踪。除了缺少 PDB 文件之外,这可能是其他问题吗?

您可以使用 .NET Reflector 反编译 DLL,获取生成的源代码并在调试中重新编译它,以便包含 .pdb 文件,然后进行调试。

我找到了解决方案,使用 WinDbg。在 WinDbg 中,附加到进程,然后发出以下命令。

.cordll -ve -u -l
~*e !clrstack

前者将加载用于托管调试的扩展(参见 here), and the latter will print all the backtraces (credit to this answer)。我相信这只是意味着 "for all threads, do !clrstack".

有用提示。Windows 调试工具的安装程序可能需要在安装 .NET 框架后重新启动系统。 您可能不希望这样做,因为它会终止您要调试的应用程序。 最糟糕的是,当它告诉您需要重新启动时,它 无论点击"OK"还是"Cancel"都会重启。幸运的是,可以运行另一台机器上的安装程序,并将WinDbg复制到目标机器上,无需安装也能正常工作。