Table of Contents
- 1. dbgsymパッケージ用リポジトリの追加
- 2. dbgsymパッケージのインストール
- 3. デバッグするパッケージのソースコードをダウンロード
- 4. GDBのインストール
- 5. パッケージのデバッグ
1 dbgsymパッケージ用リポジトリの追加
dbgsymパッケージはddebs.ubuntu.comで公開されています。ddebs.ubuntu.comをリポジトリに追加します。
$ U=http://ddebs.ubuntu.com$ D=$(lsb_release -cs)$ cat <<EOF | sudo tee /etc/apt/sources.list.d/ddebs.listdeb ${U} ${D} main restricted universe multiverse#deb ${U} ${D}-security main restricted universe multiversedeb ${U} ${D}-updates main restricted universe multiversedeb ${U} ${D}-proposed main restricted universe multiverseEOF
GPGキーをインポートします。
$ wget -O – http://ddebs.ubuntu.com/dbgsym-release-key.asc | sudo apt-key add –
リポジトリのデータベースを更新します。
$ sudo apt update -y
2 dbgsymパッケージのインストール
dbgsymがついたパッケージがデバッグシンボルを含むパッケージです。
<package>-dbgsym
この記事ではbashのデバッグシンボルを取得します。
$ sudo apt install -y bash-dbgsym$ dpkg -L bash-dbgsym/./usr/usr/lib/usr/lib/debug/usr/lib/debug/usr/usr/lib/debug/usr/bin/usr/lib/debug/usr/bin/clear_console/usr/lib/debug/bin/usr/lib/debug/bin/bash
なお、デバッグシンボルの場所を指定しなくともGDBは自動的に/usr/lib/debugへデバッグシンボルを探しに行きます。
3 デバッグするパッケージのソースコードをダウンロード
Ubuntu 18.04はデフォルトでソースコード用のリポジトリを無効にしているので、ソースコード用のリポジトリを有効にします。すでに有効にしている場合は不要です。
deb-srcを有効にします。
$ grep ‘^deb ‘ /etc/apt/sources.list | sed ‘s/^deb /deb-src /g’ | sudo tee /etc/apt/sources.list.d/deb-src.list$ sudo apt update -y
dpkg-sourceコマンドが必要になるのでdpkg-devパッケージをインストールします。
$ sudo apt install -y dpkg-dev
デバッグするパッケージのソースコードを取得します。
$ mkdir <package>$ cd <package>$ apt source <package>
この記事ではbashのソースコードを取得します。bash-4.4.18ディレクトリがソースツリーです。
$ mkdir ~/bash$ cd ~/bash$ apt source bash$ lsbash-4.4.18 bash_4.4.18-2ubuntu1.dscbash_4.4.18-2ubuntu1.debian.tar.xz bash_4.4.18.orig.tar.xz
4 GDBのインストール
gdbをインストールします。
$ sudo apt install -y gdb
5 パッケージのデバッグ
GDBにコマンドとソースコードの場所を指定することで、GDBのシェルが起動します。
$ gdb <command> –directory /path/to/source<snip>(gdb)
bashをデバッグする場合は以下のとおりです。
$ gdb bash –directory ~/bash/bash-4.4.18/<snip>(gdb) b mainBreakpoint 1 at 0x2fdb0: file .././shell.c, line 368.(gdb) rStarting program: /bin/bashBreakpoint 1, main (argc=1, argv=0x7fffffffe418, env=0x7fffffffe428) at.././shell.c:368368 {(gdb) l363 int364 main (argc, argv, env)365 int argc;366 char **argv, **env;367 #endif /* !NO_MAIN_ENV_ARG */368 {369 register int i;370 int code, old_errexit_flag;371 #if defined (RESTRICTED_SHELL)372 int saverst;
なお、la srcだとソースコードの追跡が容易です。
(gdb) la src