代码之家  ›  专栏  ›  技术社区  ›  Ambroz Bizjak

获取Release build中没有pdb文件的所有线程的堆栈跟踪

  •  2
  • Ambroz Bizjak  · 技术社区  · 10 年前

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

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

    看到一个基本的堆栈跟踪会很有帮助——我不在乎行号之类的细节。

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

    2 回复  |  直到 10 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

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

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

    前者将加载扩展以进行托管调试(请参见 here ),而后者将打印所有回溯痕迹(记入 this answer ). 我相信这只是意味着“对于所有线程 !clrstack ".

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

        2
  •  0
  •   Kristofor    10 年前

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

    推荐文章