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

how to get function name and line number when project crashed in release mode

本文关键字:获取 何获取 函数 布模式 项目 模式 崩溃      更新时间:2023-10-16

我在C++/MFC 中有一个项目

当我在调试模式下运行它时,项目崩溃了我可以得到函数和代码的行号带有SetUnhandledExceptionFilter函数但在发布模式下,我无法获得

我正在测试这个功能和源

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

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

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

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

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

PDB文件旨在为您提供这些信息;缺陷是你不想要一个PDB文件。我可以理解不想向最终用户发布PDB,但在这种情况下,为什么要让他们看到堆栈跟踪信息?对我来说,你的目标本身就是矛盾的。

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

所以,你有几个选择:

  1. 使用小型转储(理想且非常常见(
  2. 发布PDB(它不会包含比你已经试图推断的更多的信息(
  3. 在应用程序中使用内联跟踪信息,如__LINE____FILE____FUNCTION__
  4. 如果不能拼凑出有意义的堆栈跟踪,只需捕获崩溃地址即可

希望这能有所帮助!

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

在发布模式中,这类调试信息不包含在二进制文件中。您不能使用根本不存在的调试信息。

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

这里有一个非常基本的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
}

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

您可以将调试符号分开,以便您的发布版本是干净的,然后将它们与核心转储放在一起,以在之后诊断问题。

这适用于GNU/Linux,但不确定微软的对等版本是什么。有人提到PDB。。。?