Gdb 有分析内存中代码的addr2行吗?

Gdb 有分析内存中代码的addr2行吗?,gdb,stack-trace,backtrace,addr2line,Gdb,Stack Trace,Backtrace,Addr2line,我正在使用addr2line分析抛出异常后的stacktrace(使用backtrace和backtrace\u符号)。目前,从磁盘分析120Mb二进制文件(调试构建)大约需要2秒钟 是否有一个库(LGPL),它通过分析内存中的代码段来完成相同的工作?当然,这限制了我只分析自己的应用程序——但在我的用例中,这就足够了。也许您可以使用proc文件系统识别的可执行文件? (或者它实际上是进程内存中的可执行文件?) 您需要(BSD许可): 请注意,如果从二进制文件中删除符号和字符串表,则unw\u g

我正在使用
addr2line
分析抛出异常后的stacktrace(使用backtrace和backtrace\u符号)。目前,从磁盘分析120Mb二进制文件(调试构建)大约需要2秒钟


是否有一个库(LGPL),它通过分析内存中的代码段来完成相同的工作?当然,这限制了我只分析自己的应用程序——但在我的用例中,这就足够了。

也许您可以使用proc文件系统识别的可执行文件? (或者它实际上是进程内存中的可执行文件?)

您需要(BSD许可):


请注意,如果从二进制文件中删除符号和字符串表,则
unw\u get\u proc\u name()
将失败(返回非0)。

Libbacktrace是GCC发行版的一部分,它会执行此操作。它处理堆栈展开、ELF符号和调试符号,即提供libunwind和addr2line的功能

我在这里放置了一个独立的fork:

addr2line -e /proc/32213/exe
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);
    }   
}