提升堆栈跟踪不显示函数名称和行号

问题描述 投票:2回答:1

我通过尝试一个简单的例子打印递归函数的调用堆栈来探索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)
c++ boost stack-trace
1个回答
5
投票

你需要做一些事情(这是针对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


0
投票

我没有足够的声誉来评论,所以我会在这里扩展jordi的答案:

  1. 确保启用了调试信息:例如,-g
  2. 链接libdl:-ldl
  3. 定义一个必要的宏(以获取行号):例如,-DBOOST_STACKTRACE_USE_ADDR2LINE
  4. 使用-no-pie和-fno-pie选项编译和链接。
© www.soinside.com 2019 - 2024. All rights reserved.