C++ 生成C++;OS/X中的回溯(10.5.7)
我一直在利用backtrace和backtrace_符号生成编程堆栈跟踪,用于日志记录/诊断。不过,它似乎可以大致工作,我有点混乱,并且没有与每个函数调用关联的附带文件/行号(正如我在gdb bt调用或其他调用中所期望的那样)。下面是一个例子: 1莱昂纳多0x00006989例外2例外类型+111C++ 生成C++;OS/X中的回溯(10.5.7),c++,macos,stack-trace,name-mangling,backtrace,C++,Macos,Stack Trace,Name Mangling,Backtrace,我一直在利用backtrace和backtrace_符号生成编程堆栈跟踪,用于日志记录/诊断。不过,它似乎可以大致工作,我有点混乱,并且没有与每个函数调用关联的附带文件/行号(正如我在gdb bt调用或其他调用中所期望的那样)。下面是一个例子: 1莱昂纳多0x00006989例外2例外类型+111 2莱昂纳多0x00006a20_zn9例外1例外类型+24 3莱昂纳多0x0000ab64_zn5规则11应用操作16应用操作9游戏状态+1060 4莱昂纳多0x0000ed15\u ZN9Simul
2莱昂纳多0x00006a20_zn9例外1例外类型+24
3莱昂纳多0x0000ab64_zn5规则11应用操作16应用操作9游戏状态+1060
4莱昂纳多0x0000ed15\u ZN9Simulator8SimulateEv+2179
5莱昂纳多0x0000eec9\u ZN9Simulator 8SimulateEI+37
6莱昂纳多0x00009729主管道+45
7莱昂纳多0x000025c6开始+54 我遗漏了什么,做了什么傻事,或者这就是我在OS/X上的回溯所能期待的吗 其他一些花絮:
rdynamic
链接选项。-g/-g3
没有任何区别。
abi::\uuucxa\uuuuu demangle
似乎什么都没做
我不知道有任何
回溯符号()的实现,它给出的值超过符号+偏移量
关于abi::\uuuucxa\uuuuu demangle
,您需要确保只传递符号名,而不传递+行
后缀,否则它将无法识别符号有效。回溯通常以以下格式从回溯符号返回:
./MyApp(_ZN4test3fooEv+0x8)[0x821c874]
abi::_cxa_demangle只需要函数名。因此,必须首先对跟踪进行一些解析:
std::string trace(backtrace[idx]);
// attempt to demangle
{
std::string::size_type begin, end;
// find the beginning and the end of the useful part of the trace
begin = trace.find_first_of('(') + 1;
end = trace.find_last_of('+');
// if they were found, we'll go ahead and demangle
if (begin != std::string::npos && end != std::string::npos) {
trace = trace.substr(begin, end - begin);
size_t maxName = 1024;
int demangleStatus;
char* demangledName = (char*) malloc(maxName);
if ((demangledName = abi::__cxa_demangle(trace.c_str(), demangledName, &maxName,
&demangleStatus)) && demangleStatus == 0) {
trace = demangledName; // the demangled name is now in our trace string
}
free(demangledName);
}
}
我已经在我自己的项目中测试过,它使用以下格式提供了更好的回溯:
测试::foo()
当然,没有行号,但我不确定这是否可行。+1了解详细信息;正在等待关于行号是否可行的更明确的声明。行号和文件名是可行的,但它们很难正确获得。我读过很多帖子,但没有一篇一直有效。奇怪的是,MS在为跟踪堆栈提供API方面做得更好