如何分析启用优化的二进制文件(发布模式)生成的崩溃转储?

3

直到现在,我一直在项目中使用debug模式的二进制文件。因此,使用保留的符号文件分析崩溃转储非常容易。

现在我必须在Release模式下提供二进制文件。我们如何分析由Release模式二进制文件生成的转储文件。

  1. 这个问题有解决的方法吗?
  2. 如何识别Release模式下的函数?(是否需要生成并保存映射文件)

即使在发布模式下,您仍然至少会得到调用堆栈,而这通常也是从崩溃转储中所能获得的全部信息。调试符号仍然可以为发布模式的二进制文件创建。(但是我不回答,因为我对WinDbg不熟悉) - Billy ONeal
2个回答

3
你需要对应可执行文件的.pdb文件,这将提供符号。
调试发布版本存在一些棘手的部分:
1.由于优化,操作顺序可能会有所偏差。
2.整个函数/变量等可能被优化掉。
3.特别是传递给函数的参数可能不存在(例如,“this”可能是寄存器而不是内存中的位置)。Windbg非常擅长从中获取堆栈跟踪,包括确定参数。

2
没有必要有MAP文件。您需要启用“生成调试信息”/DEBUG标志,即使是Release版本也是如此。在VS2008及更高版本中,/DEBUG标志会自动设置为Release构建。在早期版本中,您需要明确执行此操作。
这将为您的.EXE/.DLL生成.PDB文件,并且您必须将它们与可执行文件/DLLS一起保存(您可以选择或不选择提供给客户)。当崩溃转储发生时,您应该拥有/获取.DMP文件。只需从存储PDB文件的位置加载Visual Studio中的该DMP文件。这将显示崩溃发生的调用堆栈。
如果有多个线程,您需要切换到“线程”窗口并查找“挂起”列。具有挂起为1的列是导致崩溃的线程。
使用此方法,您可以查看所有运行线程的正确调用堆栈。但是,您还需要正确的源代码副本才能看到代码!否则,它只会是汇编代码。MFC / ATL / STL等的部分源代码可能可见,但不是您的代码,除非您确实放置了正确的源代码。
PDB文件确实存储源代码的路径,并且它们将使调试器能够加载源文件,即使源文件不来自您放置PDB和DMP文件的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接