从C ++核心转储中推断源行号

时间:2013-10-11 05:37:16

标签: c++ linux gcc compiler-construction

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

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

问题: 由于编译器/ gcc已将源代码行转换为汇编指令,不会有一些选项可以在指令偏移量和行之间建立相关性吗?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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