Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生成C++;OS/X中的回溯(10.5.7)_C++_Macos_Stack Trace_Name Mangling_Backtrace - Fatal编程技术网

C++ 生成C++;OS/X中的回溯(10.5.7)

C++ 生成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

我一直在利用backtrace和backtrace_符号生成编程堆栈跟踪,用于日志记录/诊断。不过,它似乎可以大致工作,我有点混乱,并且没有与每个函数调用关联的附带文件/行号(正如我在gdb bt调用或其他调用中所期望的那样)。下面是一个例子:

1莱昂纳多0x00006989例外2例外类型+111
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上的回溯所能期待的吗

其他一些花絮:
  • 我没有看到我正在使用的g++版本(4.0.1)的
    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方面做得更好