【问题标题】:Is there an addr2line which analyzes Code in Memory?是否有一个 addr2line 可以分析内存中的代码?
【发布时间】:2012-06-30 18:46:53
【问题描述】:

我正在使用addr2line 来分析抛出异常后的堆栈跟踪(使用回溯和回溯符号)。目前,从磁盘分析 120Mb 二进制文件(调试版本)大约需要 2 秒。

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

【问题讨论】:

    标签: gdb stack-trace backtrace addr2line


    【解决方案1】:

    你想要(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)。

    【讨论】:

      【解决方案2】:

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

      addr2line -e /proc/32213/exe
      

      【讨论】:

        【解决方案3】:

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

        我在这里放了一个独立的分支:

        https://github.com/ErwanLegrand/libbacktrace

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-05
          • 2021-08-26
          • 2012-04-12
          • 1970-01-01
          • 2018-11-02
          • 2015-07-29
          • 1970-01-01
          相关资源
          最近更新 更多