如何解释用于GDB调试的回溯地址

如何解释用于GDB调试的回溯地址,gdb,backtrace,debug-backtrace,Gdb,Backtrace,Debug Backtrace,我使用backtrace()和backtrace_symbols()输出SIGSEGV上的backtrace和其他信号,格式如下: 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: /

我使用backtrace()和backtrace_symbols()输出SIGSEGV上的backtrace和其他信号,格式如下:

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中其他地址的精确行?如果使用调试符号编译libQTScript,您将获得更好的函数名和参数值回溯。我不知道如何在没有调试符号的情况下准确地提取相同的信息(尽管如果您有libQTScript的正确映射文件或符号表文件,这应该是可能的)

但简单的方法是使用调试符号安装libqt,然后再次运行回溯。如果已安装剥离库和调试库,并且gdb选择剥离库,则尝试将gdb指向具有LD_LIBRARY_PATH=PATH/to/debug/libs的调试库。(有关设置路径的另一种方法,请参见此答案)

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

通常,您需要在0x6f42a之前执行的指令,因此您需要执行以下操作:

(gdb) x/20i 0x6f42a-30
忽略前几条说明:您可以从中间开始反汇编。通常,反汇编会在几条指令后重新同步,然后开始显示正确的指令流

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

您的库中没有符号,因此您看到的唯一符号(例如
\u zn12qscriptvalue4callarks\u RK5QListIS\u e
)是外部可见的(即导出的)符号


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

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

更新:

在不附加GDB的情况下使用符号获取回溯


我认为
backtace\u symbols()
中不支持加载单独的debuginfo文件。

QT\u SOURCE/lib文件夹中有libQtScript.so.4.5.2.debug symbol文件。所以,也许我应该在可执行文件附近复制.debug文件,以获得带有完整符号的回溯?您可以告诉gdb将该文件用作符号表。从gdb内部尝试addsymbolfile命令,看看它是否有效。然后再次键入bt进行回溯。添加符号文件需要一个内存地址作为参数。我认为您可以通过检查命令的输出来获得地址:info sharedlibrary(开始调试,然后发出info命令)。debug file directory是用于GDB的,但是我需要使用符号进行回溯,而不附加GDB。如何确保backtrace_symbols()获取所有符号数据?放置.debug文件就足够了吗?这些崩溃是罕见的,所以我不能在我的开发环境中复制它们。
(gdb) x/20i 0x6f42a-30