当项目在发布模式下崩溃时,如何获取函数名称和行号
how to get function name and line number when project crashed in release mode
我在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,但在这种情况下,为什么要让他们看到堆栈跟踪信息?对我来说,你的目标本身就是矛盾的。
从最终用户收集调试信息的最佳解决方案是通过小型转储,而不是在客户端上拼凑堆栈跟踪。
所以,你有几个选择:
- 使用小型转储(理想且非常常见(
- 发布PDB(它不会包含比你已经试图推断的更多的信息(
- 在应用程序中使用内联跟踪信息,如
__LINE__
、__FILE__
和__FUNCTION__
- 如果不能拼凑出有意义的堆栈跟踪,只需捕获崩溃地址即可
希望这能有所帮助!
您可以从链接器获得详细的输出,该输出将显示每个函数在可执行文件中的位置。然后,您可以使用崩溃报告的偏移量来确定执行的是哪个函数。
在发布模式中,这类调试信息不包含在二进制文件中。您不能使用根本不存在的调试信息。
如果需要调试发布模式代码,请通过写入日志文件或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。。。?
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 具有默认值的引用获取函数
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 读取、读取、获取和获取行之间有什么区别?