c++ - 在 OS/X (10.5.7) 中生成 C++ BackTraces

标签 c++ macos stack-trace name-mangling backtrace

我一直在利用 backtrace 和 backtrace_symbols 生成编程堆栈跟踪以用于日志记录/诊断。它似乎大致可以工作,但是,我遇到了一些问题,并且没有与每个函数调用相关联的随附文件/行号(正如我在 gdb bt 调用或其他内容中所期望的那样)。这是一个例子:

1 莱昂纳多 0x00006989 _ZN9ExceptionC2E13ExceptionType + 111
2 莱昂纳多 0x00006a20 _ZN9ExceptionC1E13ExceptionType + 24
3 莱昂纳多 0x0000ab64 _ZN5Rules11ApplyActionER16ApplicableActionR9GameState + 1060
4 莱昂纳多 0x0000ed15 _ZN9Simulator8SimulateEv + 2179
5 莱昂纳多 0x0000eec9 _ZN9Simulator8SimulateEi + 37
6 莱昂纳多 0x00009729 主要 + 45
7 莱昂纳多 0x000025c6 开始 + 54

我遗漏了什么,做了什么傻事,或者这就是我对 OS/X 回溯的全部期望?

一些其他花絮:

  • 我没有看到我正在使用的 g++ 版本 (4.0.1) 的 rdynamic 链接选项。
  • -g/-g3 没有任何区别。
  • abi::__cxa__demangle 似乎什么都没做

  • 最佳答案

    回溯通常以下列格式从 backtrace_symbols 返回:

    ./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()

    当然,没有行号,但我不确定这是否可能。

    关于c++ - 在 OS/X (10.5.7) 中生成 C++ BackTraces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274036/

    相关文章:

    c++ - 如何使用opencv获取笔划路径?

    macos - 如何从 AXMenu 获取 AXMenuItems 数组?

    winforms - 在堆栈跟踪中获取 VB.NET 行号

    ruby - 获取 ruby 警告的堆栈跟踪信息

    c# - c# 中是否存在与 int 和 string 成员变量等效的 c++ union ?

    c++ - 在 QComboBox 中搜索 QString

    objective-c - 按修改日期降序获取文件夹顺序中的文件列表

    c# - 如何使用 C#/Mono 设置 Linux/Mac 计算机时钟?

    java - 确定 Java 中窗口激活事件的来源

    c++ - OpenCV.norm 断言错误