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

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

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

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

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

答案1

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

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

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

Qt5 的示例:

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

查找源包名称

您可以使用aptitudeDebian 软件包搜索工具找到它: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 球和其他文件(也许.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. 为了方便起见,将 GDB 命令插入到您的文件中~/.gdbinit

样本~/.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

运行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. 继续命新断点:c或者continue
  5. 当库断点被击中时,GDB将查找并显示源代码。

相关内容