gpt4 book ai didi

c - nm 和 addr2line 函数地址不匹配

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:03 29 4
gpt4 key购买 nike

我有以下代码:

#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 输出。我需要一个特定的函数地址来搜索生成的回溯日志,然后在它出现时使用 addr2line。

如何获取与 backtrace()/nm system/binutils 调用/实用程序生成的地址相匹配的特定函数地址?

最佳答案

回溯中的地址不是函数的入口点;它们是调用站点(因此它们是函数中的地址)。这就是回溯的本质。

nm显示的地址是函数名符号的地址,是函数的入口点。

关于c - nm 和 addr2line 函数地址不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9089499/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com