c++ - addr2line 获取行号总是返回 0

标签 c++ linux debugging

我使用下面的代码来获取回溯

void print_backtrace(void) {
    static const char start[] = "BACKTRACE ------------\n";
    static const char end[] = "----------------------\n";

    void *bt[1024];
    int bt_size;
    char **bt_syms;
    int i;

    bt_size = backtrace(bt, 1024);
    bt_syms = backtrace_symbols(bt, bt_size);
    for (i = 1; i < bt_size; i++) {
        size_t len = strlen(bt_syms[i]);
        std::cout << bt_syms[i] << std::endl;
    }
    free(bt_syms);
}


int main() {
    print_backtrace();
    return 0;
}

输出是:

/home/roroco/Dropbox/c/ro-c/cmake-build-debug/ex/test_backtrace_with_line_number
/home/roroco/Dropbox/c/ro-c/cmake-build-debug/ex/test_backtrace_with_line_number(main+0x9) [0x400d0b]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7ff20985c830]
/home/roroco/Dropbox/c/ro-c/cmake-build-debug/ex/test_backtrace_with_line_number(_start+0x29) [0x400b29]

当我使用 addr2line 将 addr 转换为行号时,返回值总是“??:0”,如何获得真实的行号?

roroco@roroco ~/Dropbox/c/ro-c $ addr2line -e /home/roroco/Dropbox/c/ro-c/cmake-build-debug/CMakeFiles/3.12.0/CompilerIdCXX/a.out 0x400d0b
??:0
roroco@roroco ~/Dropbox/c/ro-c $ addr2line -e /home/roroco/Dropbox/c/ro-c/cmake-build-debug/CMakeFiles/3.12.0/CompilerIdCXX/a.out 0x7ff20985c830
??:0
roroco@roroco ~/Dropbox/c/ro-c $ addr2line -e /home/roroco/Dropbox/c/ro-c/cmake-build-debug/CMakeFiles/3.12.0/CompilerIdCXX/a.out 0x400b29
??:0

最佳答案

事实证明

/home/roroco/Dropbox/c/ro-c/cmake-build-debug/CMakeFiles/3.12.0/CompilerIdCXX/a.out

不是你构建的可执行文件(对应CMake做的编译测试)

您可以尝试以下操作:

addr2line -e /home/roroco/Dropbox/c/ro-c/cmake-build-debug/ex/test_backtrace_with_line_number

其中 test_backtrace_with_line_number 对应于您构建的可执行文件。它应该是与 CMakeLists.txt

中的 add_executable 命令关联的名称

关于c++ - addr2line 获取行号总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887906/

相关文章:

c++ - 我怎样才能声明一个常量数据成员但稍后才初始化它?

c++ - 对于 QDoubleSpinBox,我可以给一个范围 0.0<min<max<1.0.如果是,我如何让步骤按钮使用它

c++ - QT 运行但 QImages 不显示在发布版本中

c++ - 在多线程代码中实现安全恢复的断点

c++ - 使用 PGP 公钥在 C++ 中使用 Windows CryptoApi 进行加密

c++ - 模板和可执行文件

c - Linux,使用Socket和读写功能,数据可以分片吗?

php - 如何在php中执行脚本

c# - 无法连接到任何指定的 mysql C#

c++ - Qt 5.x 嵌入式调试 - 部署剥离的二进制文件?