gdb - 是否有addr2line可以分析内存中的代码?

标签 gdb stack-trace backtrace addr2line

我正在使用addr2line来分析抛出异常后的堆栈跟踪(使用backtrace和backtrace_symbols)。目前,从磁盘分析 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)。

关于gdb - 是否有addr2line可以分析内存中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11258354/

相关文章:

c - 在 QEMU 中调试早期内核启动代码

c - 分配 :what can "corrupt" allocated memory in Linux/Qt application (threads involved)?

c++ - 为 MSYS 上 gdbserver 下的程序提供参数

java - "Software caused connection abort: socket write error"的官方原因

javascript - 从 Chrome 开发工具回溯中排除 jQuery

configuration - GDB:如何添加运行命令的组合键?

java - 什么是堆栈跟踪?如何使用它来调试应用程序错误?

c++ - 获取正在运行的进程的堆栈回溯

c++ - 如何在我的 C++ 程序中访问 `addr2line` 功能?

windows - Windows 上的 Rust 回溯?