我有以下代码:
#include <stdio.h>
#include <execinfo.h>
#define BACKTRACE_SIZE 10
void log()
{
void *array[BACKTRACE_SIZE];
int s =0;
s = backtrace(array, BACKTRACE_SIZE);
for (int j=1; j<s; j++)
fprintf(stdout," %p ", array[j]);
fprintf(stdout,"\n");
}
void show_1()
{
log();
}
void show_2()
{
log();
}
void show_3()
{
log();
}
void show_4()
{
log();
}
int main (void)
{
show_1();
show_2();
show_3();
show_4();
}
当我编译并运行它时,我得到以下输出:
~ 1064> a.out
0x4006dd 0x4006e9 0x2ab130eec994 0x400599
0x4006d1 0x4006ee 0x2ab130eec994 0x400599
0x4006c5 0x4006f3 0x2ab130eec994 0x400599
0x4006b9 0x4006f8 0x2ab130eec994 0x400599
但是,当我使用nm实用程序转储函数地址时,请说'show_1()',我得到:
~ 1070> nm -S a.out | grep show_1 | c++filt
00000000004006d4 000000000000000b T show_1()
~ 1071>
但是从程序stdout转储中我获得了以下输出并在其上运行addr2line实用程序:
~ 1067> addr2line -Cfe ./a.out 0x4006dd 0x4006e9 0x2ab130eec994 0x400599
show_1()
??:0
main
??:0
??
??:0
_start
??:0
此外:
~ 1072> addr2line -Cfe ./a.out 0X4006d4 0x4006dd
show_1()
??:0
show_1()
??:0
第一个输出来自nm,另一个来自程序。
现在实际上我有一个更大的代码面临同样的问题。回溯是巨大的(数据方面)我不能去为所有回溯转储addr2line输出。我需要一个特定的函数地址来搜索生成的backtraces日志,然后在它出现时使用addr2line。
如何获得与backtrace()/ nm system / binutils call / utility生成的地址匹配的特定函数地址?
答案 0 :(得分:2)
回溯中的地址不是函数的入口点;他们是呼叫站点(因此他们在函数中的地址)。这只是回溯的本质。
nm
显示的地址是函数名称符号的地址,它是函数的入口点。