代码之家  ›  专栏  ›  技术社区  ›  motam79

boost堆栈跟踪不显示函数名和行号

  •  1
  • motam79  · 技术社区  · 7 年前

    我在探索 boost::stacktrace 通过尝试一个简单的例子来打印递归函数的调用堆栈。

    #include "boost/stacktrace.hpp"
    
    int factorial(int x){
        if (x < 2) {
            std::cout << boost::stacktrace::stacktrace();
            return 1;
        }
        return x * factorial(x - 1);
    }
    
    int main(int ac, char *av[]) {
        std::cout << factorial(4);
    }
    

    但是,代码的输出不包括有关函数名和行号的任何信息:

     0# 0x000055A6F6B57C0F in /home/user/myapp
     1# 0x000055A6F6B57C42 in /home/user/myapp
     2# 0x000055A6F6B57C42 in /home/user/myapp
     3# 0x000055A6F6B57C42 in /home/user/myapp
     4# 0x000055A6F6B57C9D in /home/user/myapp
     5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
     6# 0x000055A6F6B57AEA in /home/user/myapp
    

    这与boost网站的示例输出相反: (抄送自 https://www.boost.org/doc/libs/1_68_0/doc/html/stacktrace/getting_started.html#stacktrace.getting_started.how_to_print_current_call_stack )

    0# bar(int) at /path/to/source/file.cpp:70
    1# bar(int) at /path/to/source/file.cpp:70
    2# bar(int) at /path/to/source/file.cpp:70
    3# bar(int) at /path/to/source/file.cpp:70
    4# main at /path/to/main.cpp:93
    5# __libc_start_main in /lib/x86_64-linux-gnu/libc.so.6
    6# _start
    

    为什么在堆栈跟踪输出中看不到源行号和函数名?

    我已在项目级别启用调试信息 CMakeList.txt :

    set(CMAKE_BUILD_TYPE Debug)
    

    我还可以看到在请求二进制文件时出现的符号:

    nm -an myapp | c++filt | grep factorial
    
    0000000000000f40 t _GLOBAL__sub_I__Z9factoriali
    00000000000010f0 T factorial(int)
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   jordi    7 年前

    您需要做一些事情(这是针对Linux的):

    1. 确保已启用调试信息:例如, -g

    2. 链接到libdl: -ldl

    3. 定义一个必要的宏(以获取行号):例如, -DBOOST_STACKTRACE_USE_ADDR2LINE

    所有这些信息都在这里提供:

    https://www.boost.org/doc/libs/1_69_0/doc/html/stacktrace/configuration_and_build.html