7

我正在使用 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,没有描述的模块,是什么意思?

4

2 回答 2

10

如何在反汇编中为“+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()加载单独的调试信息文件有任何支持。

于 2012-04-10T14:15:45.943 回答
0

如果您使用调试符号编译 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

于 2012-04-10T13:46:24.163 回答