背景:我正在使用 Qt5 进行编程,并希望使用 GDB 在 Debian 上调试核心 Qt5 库。
我已经安装了所有必需的-dev
软件包-dbg
。当我尝试调试时,GDB 抱怨找不到源代码。
如何安装源代码并在GDB中使用?
答案1
我正在回答我自己的问题。这比我预想的要困难,我想将所有信息收集到一个方便的地方。
安装二进制、开发和调试包
这可以使用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
- 删除根:
su -
cd /usr/src
apt-get source ${source_package_name}
- 例子:
apt-get source qtbase-opensource-src
- 例子:
- 下载源包,解压缩/解压,并修补到新目录中。
- 例子:
/usr/src/qtbase-opensource-src-5.3.2+dfsg/
- 例子:
- 删除下载的 TAR 球和其他文件(也许
.dsc
)。rm *.tar.* *.dsc
- 创建符号链接:
ln -s qtbase-opensource-src-5.3.2+dfsg qtbase-opensource-src
配置GDB
(此部分可以使用您的非root/普通帐户来完成。)
GDB 需要配置才能知道在哪里可以找到源代码。
每个源码包都有点不同,所以我以Qt5为例。
cd /usr/src/qtbase-opensource-src/src
- 查找源子目录列表:
find $(pwd) -mindepth 1 -maxdepth 1 -type d
- 例子:
/usr/src/qtbase-opensource-src/src/corelib ...
- 例子:
- 重新格式化
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 ...
- 例子:
- 为了方便起见,将 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)的调试符号编译的程序。
gdb ${program_name}
- 启动程序并
main()
自动中断:start
- 在库函数中设置断点:带单引号的
b '${function_signature}'
命令b(reakpoint)
支持(非常令人印象深刻!)制表符完成。- 示例:
b 'QStyled<tab>
->b 'QStyledItemDelegate
->::paint(<tab>
->b 'QStyledItemDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const'
- 示例:
- 继续命新断点:
c
或者continue
- 当库断点被击中时,GDB将查找并显示源代码。