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

Vin*_*gis 5 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]
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,帧#7对我来说很好,尽管帧1-6给了我一些"+ x"地址.

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

Emp*_*ian 8

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

gdb /opt/server/libQtScript.so.4
(gdb) x/10i 0x6f42a
Run Code Online (Sandbox Code Playgroud)

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

(gdb) x/20i 0x6f42a-30
Run Code Online (Sandbox Code Playgroud)

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

什么帧#0,没有描述模块,意味着什么?

您的库已被剥离符号,因此您看到的唯一符号(例如_ZN12QScriptValue4callERKS_RK5QListIS_E)是外部可见(也称为导出的)符号.

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

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

更新:

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

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