我有一个精简的 linux 系统,我必须在另一个系统上交叉编译我需要的所有应用程序。这些应用程序经常核心,我从中获得的唯一信息是核心功能和指令偏移量。如果我没有其他选择,我会对可执行文件执行 objdump,并尝试从指令偏移量和汇编代码片段中猜测源代码。这就是我的生活。
注意:这些应用程序使用 g++ 进行交叉编译并被剥离。所以gdb对我帮助不大
问题:由于编译器/gcc 已将源代码行转换为汇编指令,难道没有一些选项可以给出指令偏移量和行之间的相关性吗?
我有一个精简的 linux 系统,我必须在另一个系统上交叉编译我需要的所有应用程序。这些应用程序经常核心,我从中获得的唯一信息是核心功能和指令偏移量。如果我没有其他选择,我会对可执行文件执行 objdump,并尝试从指令偏移量和汇编代码片段中猜测源代码。这就是我的生活。
注意:这些应用程序使用 g++ 进行交叉编译并被剥离。所以gdb对我帮助不大
问题:由于编译器/gcc 已将源代码行转换为汇编指令,难道没有一些选项可以给出指令偏移量和行之间的相关性吗?
使用 创建构建-g
,然后从中获取符号映射。将其保存在某处(我建议也保存带有调试符号的二进制文件 - 这样更容易),然后删除调试符号(使用strip
程序)并将生成的二进制文件部署到目标系统。这是操作方法:https ://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html
崩溃后,使用-g
-compiled 二进制文件或发布二进制文件和单独的调试文件恢复转储。如果您有崩溃地址和带有调试符号的二进制文件,并且您想将其映射到源代码行 - 您可以使用addr2line -e your_binary crash_address
而不是 gdb。
您需要使用-g
启用调试信息的标志编译源代码,准确提供您要求的相关性。
然后,如果您的应用程序崩溃,您可以运行它gdb
并检查崩溃时的程序状态。
如果您使用未剥离的二进制文件来调试核心文件(由剥离的二进制文件生成),您可以获得行/文件信息。