バイナリ、開発、デバッグパッケージのインストール

バイナリ、開発、デバッグパッケージのインストール

背景:私は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. findGDBコマンドを生成するには、出力形式を再指定してください。
    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はソースコードを見つけて表示します。

関連情報