【发布时间】:2015-01-07 09:47:11
【问题描述】:
我在我的程序中的某个时刻进行了堆栈跟踪。一次使用 libc 的 backtrace_symbols() 函数,一次使用 libunwind 的 unw_get_proc_name()。
backtrace_symbols() 输出:
/home/jj/test/mylib.so(+0x97004)[0x7f6b47ce9004]
unw_get_proc_name() 输出:
ip: 0x7f6b47ce9004, offset: 0x458e4
这里你看到指令指针地址(0x7f6b47ce9004)是一样的并且是正确的。 backtrace_symbols() 的函数偏移量 0x97004 也是正确的,但 不是 我从 unw_get_proc_name() (0x458e4) 得到的偏移量。
是否有人知道这里发生了什么以及可能导致这种偏移差异的原因?
这两种方法都使用类似的代码,如以下示例:
回溯():
void *array[10];
size_t size;
size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
libunwind:
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);
}
【问题讨论】:
-
您没有检查来自 unw_get_proc_name 的返回值。也许它不成功并返回错误代码?似乎没有,但海事组织你仍然应该这样做。此外,您没有显示 backtrace() 的 printf。用于 libunwind 的可能表明您的 printfs 标记错误。
标签: stack-trace libc backtrace libunwind