背景:私は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はソースコードを見つけて表示します。