【问题标题】:Get stack trace of all threads without pdb files in Release build在 Release 构建中获取所有没有 pdb 文件的线程的堆栈跟踪
【发布时间】:2015-07-17 16:49:51
【问题描述】:

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

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

查看基本堆栈跟踪会很有帮助 - 我不关心行号等细节。

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

【问题讨论】:

  • 您可以尝试执行本机调试而不是托管调试。这应该向您显示堆栈跟踪。如果您想查看每个线程在内部执行的系统调用,这非常有用。您自己的代码可能很难跟踪。

标签: c# .net debugging stack-trace


【解决方案1】:

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

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

前者将加载扩展以进行托管调试(请参阅here),后者将打印所有回溯(归功于this answer)。我相信这只是意味着“对于所有线程,请执行!clrstack”。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 嗯,怀疑这会有所帮助。请注意,我实际上有源代码,并且我已经尝试构建相同的源代码并附加 debuffer。但由于某种原因,我仍然没有得到堆栈跟踪。我什至尝试将正在运行的应用程序的二进制文件复制到 VS 项目中并破解 pdb 文件以匹配这些二进制文件(使用 ChkMatch 工具)。
    • 我实际上观察到,只要我运行发布配置(远程主机运行与 VS 中完全相同的构建,并且 PDB 可用),我就会遇到完全相同的问题。我只能在调试版本中看到堆栈跟踪。除了缺少 PDB 文件之外,这可能是其他问题吗?
    • 我认为问题在于在发布模式下构建时不包含 pdb 文件。如果您需要在发布模式下进行调试,我建议您考虑使用远程调试器,但我对此并不熟悉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多