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

时间:2011-06-22 04:16:09

标签: c++ windows debugging windbg

直到现在我在项目中使用调试模式二进制文件。因此,使用保留的符号文件分析故障转储很容易。

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

  1. 有可能吗?
  2. 我如何识别发布模式下的功能? (需要生成并保留地图文件)

2 个答案:

答案 0 :(得分:3)

您需要与可执行文件对应的.pdb文件。那会给你符号。

调试发布版本有几个棘手的部分:

  1. 由于优化,操作顺序可能会被取消
  2. 整个函数/变量/等。可能会被优化掉
  3. 特别是,传递给函数的参数可能不存在(例如,'this'可能是寄存器,而不是内存中的一个点)。 Windbg非常适合从中获取堆栈跟踪,包括弄清楚参数。

答案 1 :(得分:2)

无需拥有MAP文件。您需要启用“生成调试信息”/DEBUG标志,即使对于发布版本也是如此。在VS2008及更高版本上,即使对于发布版本,也会设置/DEBUG标志。在早期版本中,您需要明确地执行此操作。

这将为您的.EXE / .DLL生成.PDB文件,您必须将它们与您的可执行文件/ DLLS一起保存(您可能会也可能不会向客户提供,这是您的选择)。发生崩溃转储时,您应该拥有/获取.DMP文件。只需从存储PDB文件的位置加载Visual Studio中的DMP文件即可。这将显示崩溃发生的调用堆栈。

如果有多个线程,则需要切换到“Threads”窗口并查找“Suspended”列。悬挂为 1 的列是导致崩溃的线程。

使用它可以看到所有正在运行的线程的正确调用堆栈。但是您还需要正确复制源代码以查看代码!否则它只是集会。除非你确实有正确的源代码,否则MFC / ATL / STL等的部分源代码可能是可见的,但不是你的代码。

PDB文件确实存储了源代码的路径,它们将使调试器能够加载源文件,即使源不是来自放置PDB和DMP文件的位置。