项目在发布模式下崩溃时如何获取函数名称和行号

时间:2011-07-06 13:40:20

标签: c++ debugging mfc crash

我有一个C ++ / MFC项目

当我在调试模式下运行并且项目崩溃时 我可以获得代码的功能和行数 使用SetUnhandledExceptionFilter函数 但在发布模式下,我无法得到它

我正在测试此功能和来源

_set_invalid_parameter_handler msdn.microsoft.com/en-us/library/a9yf33zb(v = vs.80).aspx

StackWalker http://www.codeproject.com/KB/threads/StackWalker.aspx

MiniDumpReader& crashrpt http://code.google.com/p/crashrpt/

StackTracer www.codeproject.com/KB/exception/StackTracer.aspx

在项目在发布模式下崩溃时获取函数和代码行的任何方法 不需要pdb文件或映射文件或源文件?

4 个答案:

答案 0 :(得分:3)

PDB文件旨在为您提供此信息;缺点是你不想要一个PDB文件。我可以理解不想将PDB发布给最终用户,但在这种情况下,为什么要让他们看到堆栈跟踪信息?对我而言,你的目标与自身相冲突。

从最终用户收集调试信息的最佳解决方案是通过minidump,而不是在客户端拼凑堆栈跟踪。

所以,你有几个选择:

  1. 使用minidumps(理想且非常常见)
  2. 发布PDB(不会包含比您已经尝试推断的更多信息)
  3. 在您的应用中使用内嵌跟踪信息,例如__LINE____FILE____FUNCTION__
  4. 如果您无法将有意义的堆栈跟踪拼凑在一起,只需捕获崩溃地址。
  5. 希望这有帮助!

答案 1 :(得分:1)

在发布模式下,这种调试信息不​​包含在二进制文件中。您无法使用那些根本就没有的调试信息。

如果需要调试发布模式代码,请通过写入日志文件或标准输出来手动跟踪执行。您可以使用__FUNCTION____LINE__包含有关代码显示位置的信息,编译器将使用它们出现在/中的函数/行替换它们。还有许多其他有用的predefined macros可用于调试代码。

这是一个非常基本的TR宏,您可以通过代码遍历执行流程。

void trace_function(const char* function, int line) {
  std::cout << "In " << function << " on line " << line << std::endl;
}

#define TR trace_function(__FUNCTION__, __LINE__)

通过将TR放在每个函数的顶部或您想要确保执行流程到达的任何地方来使用它:

void my_function() {
   TR();
   // your code here
}

但最好的解决方案是在调试模式下进行调试。

答案 2 :(得分:1)

您可以从链接器获取详细输出,该输出将显示每个函数在可执行文件中的位置。然后,您可以使用崩溃报告中的偏移量来确定正在执行的函数。

答案 3 :(得分:0)

您可以separate the debug symbols以便您的发布版本是干净的,然后将它们与核心转储一起用于诊断问题。

这适用于GNU / Linux,不确定Microsoft的等价物。有人提到过PDB ......?