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

本文关键字:pdb 文件 线程 跟踪 堆栈 布版本 版本 获取 | 更新日期: 2023-09-27 18:03:20

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

当我附加一个VS2013调试器(通过远程调试),我可以看到线程列表,但没有任何堆栈跟踪。堆栈跟踪窗口只包含每个线程的"外部代码"。

看到一个基本的堆栈跟踪会很有帮助——我不关心像行号这样的细节。

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

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

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

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

前者将加载扩展以进行托管调试(见这里),后者将打印所有回溯(归功于此答案)。我相信这只是意味着"对于所有线程,执行!clrstack"。

有用的提示。 Windows调试工具的安装程序可能希望在安装了。net框架后重新启动系统。您可能不希望这样做,因为这会杀死您想要调试的应用程序。更糟糕的是,当它告诉你需要重新启动时,无论你点击"确定"或"取消",它都会重新启动。幸运的是,您可以在另一台机器上运行安装程序,并将WinDbg复制到目标机器上,在那里它无需安装即可正常工作。

您可以使用。net Reflector来反编译DLL,获取结果源并在调试中重新编译它,以便包含。pdb文件,然后进行调试。