我试图在Linux系统上对崩溃的二进制文件“TestApp”进行事后分析。
我有一个二进制文件的副本,以及在路径中复制到设备上的共享对象:
/usr/public/target
此文件夹包含所测试系统上使用的目录结构中的所有二进制文件,即:
/usr/public/target/sbin/TestApp
/usr/public/target/lib/TestAppLib.so
/usr/public/target/usr/lib/TestAppAPILib.so
自动构建过程从二进制文件中删除调试信息,并将它们存储在外部符号文件中,所有文件都在:
/usr/public/target_external_symbols
因此上述二进制文件的符号信息将存在于名为:
的文件中/usr/public/target_external_symbols/sbin/TestApp.sym
/usr/public/target_external_symbols/lib/TestAppLib.so.sym
/usr/public/target_external_symbols/usr/lib/TestAppAPILib.so.sym
如何让GDB知道这些外部符号的存在并加载它们?
我通常通过以下方式调用GDB:
gdb TestApp TestApp.core
我已经参考了有关创建测试.gdbinit
文件并通过-command
参数将其传递给GDB的其他文章,但它似乎不起作用。每当我尝试从我的核心文件中获取回溯时,我都会从GDB得到一个指示,它无法打开调试符号。任何帮助解决这个问题都表示赞赏。
(gdb) info shared
From To Syms Read Shared Object Library
0x78000000 0x780061e8 Yes (*) /usr/public/target/lib/TestAppLib.so
0x78010000 0x7806e60c Yes (*) /usr/public/target/usr/lib/TestAppAPILib.so
0x78070000 0x78091d2c Yes (*) /usr/public/target/lib/libm.so.2
(*): Shared library is missing debugging information.
谢谢。
答案 0 :(得分:3)
有一些命令set debug-file-directory
,symbol-file
和add-symbol-file
可以在gdb会话中加载调试符号。后者可能需要将共享库加载到内存中的地址。
也许在您的构建过程中,“gnu debuglinks”已添加到您的二进制文件中。这意味着在可执行文件中有一个编码的路径,指示gdb在哪里查找调试符号。可以找到更多here。