【问题标题】:Infering the source line number from C++ core dump从 C++ 核心转储中推断源代码行号
【发布时间】:2013-10-11 05:37:16
【问题描述】:

我有一个精简的 linux 系统,我必须在另一个系统上交叉编译我需要的所有应用程序。这些应用程序经常核心,我从中获得的唯一信息是核心功能和指令偏移量。如果我没有其他选择,我会对可执行文件进行 objdump,并尝试从指令偏移量和汇编 sn-ps 中猜测源代码。这就是我的生活。

注意:这些应用程序使用 g++ 进行交叉编译并被剥离。所以gdb对我帮助不大

问题: 由于编译器/gcc 已经将源代码行转换为汇编指令,难道没有一些选项可以给出指令偏移量和行之间的相关性吗?

【问题讨论】:

    标签: c++ linux gcc compiler-construction


    【解决方案1】:

    使用-g 创建构建,然后从中获取符号映射。将其保存在某处(我建议也保存带有调试符号的二进制文件 - 这样更容易),然后删除调试符号(使用strip 程序)并将生成的二进制文件部署到目标系统。操作方法如下:https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

    崩溃后,使用-g-compiled 二进制文件或发布二进制文件和单独的调试文件恢复转储。如果您有崩溃地址和带有调试符号的二进制文件,并且您想将其映射到源代码行 - 您可以使用 addr2line -e your_binary crash_address 而不是 gdb。

    【讨论】:

      【解决方案2】:

      您需要使用启用调试信息的-g 标志编译源代码,从而准确提供您所要求的相关性。

      然后,如果您的应用程序崩溃,您可以在gdb 中运行它并检查崩溃时的程序状态。

      【讨论】:

        【解决方案3】:

        如果您使用未剥离的二进制文件来调试核心文件(由剥离的二进制文件生成),您可以获得行/文件信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-11
          • 2018-04-03
          • 1970-01-01
          • 1970-01-01
          • 2022-08-21
          • 2021-11-13
          • 2020-10-17
          • 2017-09-11
          相关资源
          最近更新 更多