tur*_*1ng 8 libc stack-trace backtrace libunwind
我在程序中的某个点上进行了堆栈跟踪.一旦与libc中的backtrace_symbols()
功能,一旦与unw_get_proc_name()
来自libunwind.
backtrace_symbols()输出:
/home/jj/test/mylib.so(+0x97004)[0x7f6b47ce9004]
Run Code Online (Sandbox Code Playgroud)
unw_get_proc_name()输出:
ip: 0x7f6b47ce9004, offset: 0x458e4
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到指令指针地址(0x7f6b47ce9004)是相同且正确的.功能失调0x97004
来自backtrace_symbols()也是正确的,但没有一个我从拿到unw_get_proc_name() (0x458e4
).
有人知道这里发生了什么以及可能导致这种抵消差异的原因是什么?
两种方法都使用类似的代码,如下面的示例:
回溯():
void *array[10];
size_t size;
size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
我认为unw_get_proc_name
计算来自未命名内部框架的偏移量。
例如:
void f() {
int i;
while (...) {
int j;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,循环块内有一个变量声明。在这种情况下(并且取决于优化级别),编译器可能会为循环创建一个框架(以及相关的展开信息)。因此,unw_get_proc_name
计算从此循环开始的偏移量,而不是函数开始的偏移量。
手册页对此进行了解释unw_get_proc_name
:
请注意,在某些平台上没有可靠的方法来区分过程名称和普通标签。此外,如果符号信息已从程序中剥离,则过程名称可能完全不可用,或者可能仅限于通过动态符号表导出的名称。在这种情况下,unw_get_proc_name() 可能会返回标签或前一个(附近)过程的名称。
您可以尝试再次测试,但不剥离您的二进制文件(由于unw_get_proc_name
无法找到函数名称,我认为您的二进制文件已被剥离)。
归档时间: |
|
查看次数: |
1331 次 |
最近记录: |