首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libc的backtrace_symbols()和libunwind的unw_get_proc_name()中的不同偏移量

libc的backtrace_symbols()和libunwind的unw_get_proc_name()中的不同偏移量
EN

Stack Overflow用户
提问于 2015-01-07 09:47:11
回答 1查看 2.2K关注 0票数 9

我在程序中的某个点做了一个堆栈跟踪。一次使用libc的backtrace_symbols()函数,一次使用libunwind的unw_get_proc_name()

backtrace_symbols()输出:

代码语言:javascript
复制
/home/jj/test/mylib.so(+0x97004)[0x7f6b47ce9004]

unw_get_proc_name()输出:

代码语言:javascript
复制
ip: 0x7f6b47ce9004, offset: 0x458e4

在这里,您可以看到指令指针地址(0x7f6b47ce9004)是相同的和正确的。从backtrace_symbols()得到的函数偏移量backtrace_symbols()也是正确的,但是不是--我从unw_get_proc_name() (0x458e4)获得的函数。

有人知道这是怎么回事吗?是什么引起了这种抵消的差异?

这两种方法都使用类似的代码,如下所示:

backtrace():

代码语言:javascript
复制
void *array[10];
size_t size;

size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);

libunwind:

代码语言:javascript
复制
unw_cursor_t    cursor;
unw_context_t   context;

unw_getcontext(&context);
unw_init_local(&cursor, &context);

while (unw_step(&cursor) > 0) {
    unw_word_t  offset, pc; 
    char        fname[64];

    unw_get_reg(&cursor, UNW_REG_IP, &pc);

    fname[0] = '\0';
    (void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset);

    printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, pc);
}
EN

回答 1

Stack Overflow用户

发布于 2015-01-22 12:22:00

我认为unw_get_proc_name计算的偏移量来自未命名的内部框架。

例如:

代码语言:javascript
复制
void f() {
   int i;
   while (...) {
     int j;
   }
}

注意,循环块中有一个变量声明。在这种情况下(并且取决于优化级别),编译器可以为循环创建一个框架(以及相关的展开信息)。因此,unw_get_proc_name计算这个循环的偏移量,而不是函数的开始。

这在unw_get_proc_name手册页中有解释:

请注意,在某些平台上,没有可靠的方法来区分过程名称和普通标签。此外,如果已从程序中删除符号信息,则过程名称可能完全不可用,或可能仅限于通过动态符号表导出的程序名称。在这种情况下,unw_get_proc_name()可以返回标签或(附近)过程的名称。

您可以尝试再次测试,但不需要删除二进制文件(因为unw_get_proc_name无法找到函数的名称,我认为您的二进制文件被删除了)。

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

https://stackoverflow.com/questions/27816558

复制
相关文章

相似问题

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