如何使用 GDB 调试已安装的 Qt5 库?

kev*_*rpe 7 debugging qt

背景:我正在使用 Qt5 进行编程,并希望使用 GDB 在 Debian 上调试核心 Qt5 库。

我已经安装了所有必要的-dev-dbg包。当我尝试调试时,GDB 抱怨找不到源代码。

如何安装源代码并在 GDB 中使用?

kev*_*rpe 9

我正在回答我自己的问题。这比我想象的要难,我想在一个方便的地方收集所有信息。

安装二进制、开发和调试包

这可以使用apt(或aptitude)来完成。

Qt5 示例:

  • 编译的库: qt5-default
  • 开发包(头文件): qtbase5-dev
  • 调试符号: qtbase5-dbg

查找源包名称

您可以使用aptitude或 Debian 软件包搜索工具找到它:https : //www.debian.org/distrib/packages#search_packages

示例:搜索qtbase5-dbg会发现:https : //packages.debian.org/jessie/qtbase5-dbg

每个二进制包页面的顶部都有一个指向源包的链接。

例子: qtbase-opensource-src

安装源包

如有必要,请首先apt阅读以下答案配置您的源包存储库:https : //unix.stackexchange.com/a/121042/29414

  1. 删除根: su -
  2. cd /usr/src
  3. apt-get source ${source_package_name}
    • 例子: apt-get source qtbase-opensource-src
  4. 源包被下载、解压/解压,并被打到一个新目录中。
    • 例子: /usr/src/qtbase-opensource-src-5.3.2+dfsg/
  5. 删除下载的 TAR ball 和其他文件(可能.dsc)。
    rm *.tar.* *.dsc
  6. 创建符号链接: ln -s qtbase-opensource-src-5.3.2+dfsg qtbase-opensource-src

配置 GDB

(此部分可以使用您的非 root / 普通帐户完成。)

GDB 需要配置才能知道在哪里可以找到源代码。

每个源码包都略有不同,所以我以Qt5为例。

  1. cd /usr/src/qtbase-opensource-src/src
  2. 查找源子目录列表:
    find $(pwd) -mindepth 1 -maxdepth 1 -type d
    • 例子: /usr/src/qtbase-opensource-src/src/corelib ...
  3. 重新格式化find输出以创建 GDB 命令:
    find $(pwd) -mindepth 1 -maxdepth 1 -type d | sort | xargs -l -i printf -- 'directory %s\n' "{}"
    • 例子: directory /usr/src/qtbase-opensource-src/src/3rdparty ...
  4. ~/.gdbinit为方便起见,将GDB 命令插入到您的命令中。

样品~/.gdbinit

set auto-load safe-path /
set history save
set history filename ~/.gdb_history

directory /usr/src/qtbase-opensource-src/src/3rdparty
directory /usr/src/qtbase-opensource-src/src/android
directory /usr/src/qtbase-opensource-src/src/angle
directory /usr/src/qtbase-opensource-src/src/concurrent
directory /usr/src/qtbase-opensource-src/src/corelib
directory /usr/src/qtbase-opensource-src/src/dbus
directory /usr/src/qtbase-opensource-src/src/gui
directory /usr/src/qtbase-opensource-src/src/network
directory /usr/src/qtbase-opensource-src/src/opengl
directory /usr/src/qtbase-opensource-src/src/openglextensions
directory /usr/src/qtbase-opensource-src/src/platformsupport
directory /usr/src/qtbase-opensource-src/src/plugins
directory /usr/src/qtbase-opensource-src/src/printsupport
directory /usr/src/qtbase-opensource-src/src/sql
directory /usr/src/qtbase-opensource-src/src/testlib
directory /usr/src/qtbase-opensource-src/src/tools
directory /usr/src/qtbase-opensource-src/src/widgets
directory /usr/src/qtbase-opensource-src/src/winmain
directory /usr/src/qtbase-opensource-src/src/xml
show directories
Run Code Online (Sandbox Code Playgroud)

运行 GDB

本节假设您已经编译了一个程序,其中调试符号链接到感兴趣的库,例如 Qt5。

  1. gdb ${program_name}
  2. 启动程序并main()自动中断:start
  3. 在库函数中设置断点:带单引号的b '${function_signature}'
    命令b(reakpoint)支持(非常令人印象深刻!)制表符补全。
    • 示例:b 'QStyled<tab>
      -> b 'QStyledItemDelegate
      -> ::paint(<tab>
      ->b 'QStyledItemDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const'
  4. 继续命中新断点:ccontinue
  5. 当遇到库断点时,GDB 会查找并显示源代码。