如何解释回溯地址以便使用GDB进行调试

时间:2012-04-10 13:40:58

标签: gdb backtrace debug-backtrace

我正在使用backtrace()和backtrace_symbols()来输出SIGSEGV和其他信号的回溯,格式如下:

0: [0xb750818]
1: /opt/server/libQtScript.so.4(+0x6f42a) [0xb782c42a]
2: /opt/server/libQtScript.so.4(+0x7bffc) [0xb7838ffc]
3: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946]
4: /opt/server/libQtScript.so.4(+0x7c4bc) [0xb78394bc]
5: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946]
6: /opt/server/libQtScript.so.4(+0x9603e) [0xb785303e]
7: /opt/server/libQtScript.so.4(_ZN12QScriptValue4callERKS_RK5QListIS_E+0x2e7) [0xb7891647]

在这种特殊情况下,第7帧对我来说很好,虽然第1-6帧给了我一些“+ x”地址。

如何在“+ 0x6f42a”和GDB中的其他地址反汇编中得到确切的行?什么帧#0,没有描述模块,意味着什么?

2 个答案:

答案 0 :(得分:8)

  

如何在“+ 0x6f42a”和GDB中的其他地址反汇编中获得确切的行?

gdb /opt/server/libQtScript.so.4
(gdb) x/10i 0x6f42a

通常你会想要在 0x6f42a之前执行的指令,所以你会这样做:

(gdb) x/20i 0x6f42a-30

忽略前几条指令:您可以从一个中间开始反汇编。通常,反汇编会在几条指令后重新同步,并在此之后开始显示正确的指令流。

  

没有描述模块的#0帧是什么意思?

您的图书馆已被删除符号,因此您看到的唯一符号(例如_ZN12QScriptValue4callERKS_RK5QListIS_E)是外部可见的(也称为已导出的)符号。

  

QT_SOURCE / lib文件夹中有libQtScript.so.4.5.2.debug符号文件。那么也许我应该在可执行文件附近复制.debug文件以获得带有完整符号的回溯?

如果您将libQtScript.so.4.5.2.debug设置为debug-file-directory,GDB应自动从$QT_SOURCE/lib加载符号。

更新

  

我在没有附加GDB的情况下使用符号进行回溯

我不相信backtace_symbols()中有任何支持加载单独的debuginfo文件。

答案 1 :(得分:0)

如果您使用debug-symbols编译了libQTScript,您将获得更好的函数名称和参数值的回溯。我不知道如何在没有调试符号的情况下提取相同的信息(尽管如果你有正确的libQTScript映射文件或符号表文件,它应该是可能的。)

但是简单的方法是使用调试符号安装libqt并再次运行回溯。如果安装了剥离和调试库并且gdb选择了剥离的库,请尝试使用LD_LIBRARY_PATH = path / to / debug / libs将gdb指向调试库。 (请参阅此答案,了解另一种设置路径How do I prepend a directory the library path when loading a core file in gdb on Linux

的方法