首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nm和addr2line函数地址不匹配

nm和addr2line函数地址不匹配
EN

Stack Overflow用户
提问于 2012-02-01 01:25:33
回答 1查看 1.7K关注 0票数 1

我有以下代码:

代码语言:javascript
复制
#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();
}

当我编译和运行它时,我得到以下输出:

代码语言:javascript
复制
~ 1064> a.out
 0x4006dd  0x4006e9  0x2ab130eec994  0x400599
 0x4006d1  0x4006ee  0x2ab130eec994  0x400599
 0x4006c5  0x4006f3  0x2ab130eec994  0x400599
 0x4006b9  0x4006f8  0x2ab130eec994  0x400599

然而,当我使用nm实用程序转储一个函数地址时,比如'show_1()‘,我得到:

代码语言:javascript
复制
~ 1070>  nm -S a.out | grep show_1 | c++filt
00000000004006d4 000000000000000b T show_1()
~ 1071>

但是,从程序stdout转储中,我获得了下面的输出,并在其上运行addr2line实用程序:

代码语言:javascript
复制
~ 1067> addr2line -Cfe ./a.out 0x4006dd  0x4006e9  0x2ab130eec994  0x400599
show_1()
??:0
main
??:0
??
??:0
_start
??:0

此外:

代码语言:javascript
复制
~ 1072> addr2line -Cfe ./a.out 0X4006d4 0x4006dd
show_1()
??:0
show_1()
??:0

第一个输出来自nm,其他输出来自程序。

现在,在实际中,我有一个更大的代码面临同样的问题。回溯是巨大的(就数据而言),我不能转储所有回溯的addr2line输出。我需要一个特定的函数地址在回溯日志中搜索生成,然后在发生时使用addr2line。

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

EN

回答 1

Stack Overflow用户

发布于 2012-02-01 02:45:53

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9089499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档