提问人:Tokubara 提问时间:11/14/2023 最后编辑:genpfaultTokubara 更新时间:11/14/2023 访问量:45
如何将backtrace()与addr2line一起使用来获取调用堆栈的行号?
How to use backtrace() with addr2line to get line numbers of the call stack?
问:
我正在尝试结合使用以获取调用堆栈的行号。backtrace()
addr2line
这是我的内容:main.cpp
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void print_stack_trace() {
void *array[10];
size_t size;
char **strings;
size_t i;
// Get the current call stack
size = backtrace(array, 20);
// Convert it into an array of strings
strings = backtrace_symbols(array, size);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
// Print all the stack trace symbols
for (i = 0; i < size; i++) {
printf("%s\n", strings[i]);
}
free(strings);
}
void dummy_function() {
// Generate a stack trace
print_stack_trace();
}
int main(void) {
// Call a function and then print the stack trace within that function
dummy_function();
return 0;
}
我使用以下命令编译了代码:
g++ -rdynamic -g3 main.cpp -o main.out
当我运行可执行文件时:
./main.out
输出为:
./main.out(_Z17print_stack_tracev+0x2c) [0x556c59bed235]
./main.out(_Z14dummy_functionv+0xd) [0x556c59bed2da]
./main.out(main+0xd) [0x556c59bed2ea]
/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f9128c7bd90]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f9128c7be40]
./main.out(_start+0x25) [0x556c59bed145]
根据手册页,括号中的地址(例如,)是返回地址。我已经使用该选项进行了编译,并使用如下:backtrace_symbols()
0x556c59bed2da
-g
addr2line
addr2line -f -e ./main.out 0x556c59bed2da
但输出是:
??
??:0
我检查了函数地址:objdump
objdump -S -l -d ./main.out
地址似乎以 开头,如下所示:0000
0000000000001209 <_Z17print_stack_tracev>:
00000000000012cd <_Z14dummy_functionv>:
这些与输出 () 不匹配。backtrace_symbols()
0x556c59bed2da
如何使用正确确定调用堆栈的行号?addr2line
答:
1赞
273K
11/14/2023
#1
通过检查程序运行时在内存中查找进程的基址。这是一行,其中包含程序名称和权限(可执行段)。/proc/<PID>/maps
r-xp
假设基址是 。那么 .text 映射表中的地址是减号是 。将其传递给 。0x556c59bec000
_Z14dummy_functionv
0x556c59bed2da
0x556c59bec000
12da
addr2line
评论
c++filt