如何从发布版本的回溯中恢复符号?

时间:2014-01-09 05:08:48

标签: c++ c backtrace

我有一个应用程序的源代码,我编译并提供给朋友。在应用程序中,有一个信号handeler将堆栈跟踪保存到磁盘(通过回溯或Windows版本)。发生异常并且程序将堆栈保存到磁盘后,我的朋友给了我一份该文件,我想将地址转换回符号。我该怎么做?

1 个答案:

答案 0 :(得分:1)

没有崩溃转储文件可能很困难,因为ASLR(地址空间布局随机化)可能会在每次启动时将代码放在不同的地址。

处理此问题的最佳方法是制作崩溃转储文件,然后调试器(Visual Studio或WinDbg)可以将地址转换回适合您的函数。在我自己的应用程序中,每当我遇到崩溃时都会从代码创建一个崩溃转储文件(在DBGHELP.DLL中查找函数MiniDumpWriteDump),但您也可以使用外部实用程序手动创建正在运行的应用程序的故障转储(任务管理器来自Windows,Process Explorer或来自SysInternals的ProcDump)。

然后,您可以轻松地在调试器中加载转储文件,并使用它将地址转换为函数名称。例如。在Visual Studio中,打开反汇编窗口并键入函数的地址。

其他一些实用程序使用相同的技巧。例如。非常困难的CS(https://github.com/CyberShadow/verysleepy)可以在您没有准备好符号的环境中分析应用程序时生成故障转储文件。然后在之后完成将地址解析为函数名称。地址映射到DLL的/ EXE中的偏移量(通过使用故障转储文件)和函数名称(通过使用PDB文件)。