我有一个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文件或映射文件或源文件?
答案 0 :(得分:3)
PDB文件旨在为您提供此信息;缺点是你不想要一个PDB文件。我可以理解不想将PDB发布给最终用户,但在这种情况下,为什么要让他们看到堆栈跟踪信息?对我而言,你的目标与自身相冲突。
从最终用户收集调试信息的最佳解决方案是通过minidump,而不是在客户端拼凑堆栈跟踪。
所以,你有几个选择:
__LINE__
,__FILE__
和__FUNCTION__
。希望这有帮助!
答案 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 ......?