Boost 堆栈跟踪不显示函数名称和行号
Boost stack-trace not showing function names and line numbers
我通过尝试一个简单的例子来探索 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)
你需要做一些事情(这是为了 Linux):
确保已启用调试信息:例如,-g
Link 针对 libdl:-ldl
定义必要的宏之一(以获取行号):例如,-DBOOST_STACKTRACE_USE_ADDR2LINE
此处提供所有信息:
https://www.boost.org/doc/libs/1_69_0/doc/html/stacktrace/configuration_and_build.html
我没有足够的声誉来发表评论,所以我将在这里扩展 jordi 的回答:
确保启用了调试信息:例如,-g
Link 针对 libdl:-ldl
定义必要的宏之一(以获取行号):例如,-DBOOST_STACKTRACE_USE_ADDR2LINE
使用 -no-pie 和 -fno-pie 选项编译和 link。
这对我有用,我正在用 g++ 编译:
- 使用 -g -ggdb -no-pie -fno-pie -rdynamic 编译
- 定义宏-DBOOST_STACKTRACE_USE_ADDR2LINE
- Link 针对 libdl -libl 和 -no-pie -fno-pie
Edit :在我的例子中,rdynamic 是缺少的位,它允许我拥有未被混淆的函数名称和行号
这对我有用:
g++ -g backtrace.cpp -o bb -lboost_stacktrace_backtrace -D BOOST_STACKTRACE_LINK
-D BOOST_STACKTRACE_LINK 是为我解决问题的缺失选项。
我通过尝试一个简单的例子来探索 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)
你需要做一些事情(这是为了 Linux):
确保已启用调试信息:例如,
-g
Link 针对 libdl:
-ldl
定义必要的宏之一(以获取行号):例如,
-DBOOST_STACKTRACE_USE_ADDR2LINE
此处提供所有信息:
https://www.boost.org/doc/libs/1_69_0/doc/html/stacktrace/configuration_and_build.html
我没有足够的声誉来发表评论,所以我将在这里扩展 jordi 的回答:
确保启用了调试信息:例如,-g
Link 针对 libdl:-ldl
定义必要的宏之一(以获取行号):例如,-DBOOST_STACKTRACE_USE_ADDR2LINE
使用 -no-pie 和 -fno-pie 选项编译和 link。
这对我有用,我正在用 g++ 编译:
- 使用 -g -ggdb -no-pie -fno-pie -rdynamic 编译
- 定义宏-DBOOST_STACKTRACE_USE_ADDR2LINE
- Link 针对 libdl -libl 和 -no-pie -fno-pie
Edit :在我的例子中,rdynamic 是缺少的位,它允许我拥有未被混淆的函数名称和行号
这对我有用:
g++ -g backtrace.cpp -o bb -lboost_stacktrace_backtrace -D BOOST_STACKTRACE_LINK
-D BOOST_STACKTRACE_LINK 是为我解决问题的缺失选项。