是否有 windows 实用程序可以将 .NET 进程的所有 运行 线程的当前堆栈跟踪列出到纯文本文件中?

Is there a windows utility to list the current stack trace of all running thread for a .NET process into a plain text file?

一些背景:
我们有一个 .NET 服务应用程序 运行,我们希望能够生成一个 'stack-trace dump' 文本文件,我们可以在纯文本文件中查看当前 运行 线程及其堆栈跟踪.第一个想法是枚举应用程序中的所有 运行 线程并获取它们的堆栈跟踪,然后从应用程序中将它们打印出来。然而,似乎没有支持的方法来做到这一点(你不能在应用程序中枚举线程,即使你知道线程也不能获取堆栈跟踪信息)。此外,如果应用程序挂起,该方法将不起作用,因为我们无法向其发出创建此 'text dump'.

的信号

是否有一个实用程序(或一组可以通过批处理文件执行的实用程序)来生成纯文本文件,我可以在其中查看 .NET 运行 中所有线程的所有堆栈跟踪 application/process?
当然,它应该能够读取 .pdb 文件并打印真实的方法名称。

我看到有实用程序可以附加到进程并生成标准转储文件,但我不知道如何使用该转储文件在文本文件中获取用户友好的堆栈跟踪。

procdump -> cdbg(WinDbg 的命令行版本)。

当然,您需要加载 SOS 扩展以获取有关 .NET 线程的信息。涉及很多繁重的工作,所以不要感到惊讶,这并不完全容易——但 SOS 几乎向您隐藏了所有这些工作。只要 SOS 在线,只需 运行 !EEStack 就可以了:)

如果您需要更多详细信息,!CLRStack 命令可以为您提供更多信息(包括方法参数和局部变量 - 只有那些没有优化掉的,没有名字,但是嘿 :)) ,但必须为每个线程手动设置 运行。这可以通过 ~*e!clrstack.

来完成

您需要安装 Windows SDK(对于 WinDbg+Cdbg),ProcDump 是一个免费(且不受支持)的实用程序。您需要进行完整的进程转储 - 小型转储没有足够的信息让 SOS 完成它的工作,因此在您的服务器上直接进行转储-> 翻译可能是可行的。

您可能需要一些时间才能了解方位 - WinDbg 毕竟是一个内核调试器,并且它的设计带有非常内核色彩的眼镜。不过,它几乎可以让您做任何事情。如果您喜欢冒险,您甚至可以完全跳过 Procdump 步骤并直接附加到您的流程,从而节省宝贵的时间:)