背景:我正在使用 Qt5 进行编程,并希望使用 GDB 在 Debian 上调试核心 Qt5 库。
我已经安装了所有必要的-dev
和-dbg
包。当我尝试调试时,GDB 抱怨找不到源代码。
如何安装源代码并在 GDB 中使用?
我正在回答我自己的问题。这比我想象的要难,我想在一个方便的地方收集所有信息。
这可以使用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/
.dsc
)。rm *.tar.* *.dsc
ln -s qtbase-opensource-src-5.3.2+dfsg qtbase-opensource-src
(此部分可以使用您的非 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 ...
~/.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)
本节假设您已经编译了一个程序,其中调试符号链接到感兴趣的库,例如 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