我addr2line
用来分析抛出异常后的堆栈跟踪(使用回溯和回溯符号)。目前,从磁盘分析 120Mb 二进制文件(调试版本)大约需要 2 秒。
是否有一个库(LGPL),它通过分析内存中的代码段来完成同样的工作?当然,这限制了我只能分析自己的应用程序——但在我的用例中,这就足够了。
我addr2line
用来分析抛出异常后的堆栈跟踪(使用回溯和回溯符号)。目前,从磁盘分析 120Mb 二进制文件(调试版本)大约需要 2 秒。
是否有一个库(LGPL),它通过分析内存中的代码段来完成同样的工作?当然,这限制了我只能分析自己的应用程序——但在我的用例中,这就足够了。
你想要(BSD 许可)libunwind:
void backtrace(void)
{
int r;
unw_cursor_t cursor; unw_context_t uc;
unw_word_t ip, sp;
char symname[100];
unw_getcontext(&uc);
unw_init_local(&cursor, &uc);
while (unw_step(&cursor) > 0) {
r = unw_get_reg(&cursor, UNW_REG_IP, &ip);
assert(r == 0);
r = unw_get_reg(&cursor, UNW_REG_SP, &sp);
assert(r == 0);
r = unw_get_proc_name(&cursor, symname, sizeof(symname), NULL);
assert(r == 0);
fprintf(stderr, "%s: ip: %lx, sp: %lx\n", symname, (long) ip, (long) sp);
}
}
请注意,unw_get_proc_name()
如果您从二进制文件中删除符号和字符串表,则会失败(返回非 0)。
也许您可以使用proc文件系统识别的可执行文件?(或者它实际上是进程内存中的可执行文件?)
addr2line -e /proc/32213/exe
作为 GCC 发行版的一部分的 Libbacktrace 执行此操作。它处理堆栈展开、ELF 符号和调试符号,即它提供了 libunwind 和 addr2line 的功能。
我在这里放了一个独立的叉子: