【问题标题】:How to interpret backtrace addresses for debugging with GDB如何解释回溯地址以使用 GDB 进行调试
【发布时间】:2012-04-10 13:40:58
【问题描述】:

我正在使用 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 帧是什么意思?

【问题讨论】:

    标签: gdb backtrace debug-backtrace


    【解决方案1】:

    如何在反汇编中为“+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 文件以获取带有完整符号的回溯?

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

    更新:

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

    我认为backtace_symbols() 不支持加载单独的调试信息文件。

    【讨论】:

    • debug-file-directory 用于 GDB,但我提到在不附加 GDB 的情况下使用符号进行回溯。如何确保 backtrace_symbols() 获取所有符号数据?放置 .debug 文件就足够了吗?这些崩溃很少见,所以我不能在我的开发环境中重现它们。
    【解决方案2】:

    如果您使用调试符号编译 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 的另一种方法,请参阅此答案)

    【讨论】:

    • QT_SOURCE/lib 文件夹中有 libQtScript.so.4.5.2.debug 符号文件。所以也许我应该在可执行文件附近复制 .debug 文件以获取带有完整符号的回溯?
    • 您可以告诉 gdb 将该文件用作符号表。从 gdb 中尝试命令 add-symbol-file 并查看它是否有效。然后再次输入 bt 进行回溯。
    • add-symbol-file 需要一个内存地址作为参数。我认为您可以通过检查命令的输出来获取地址:info sharedlibrary(开始调试,然后发出 info 命令)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多