デバッグ/トレースを取得
この記事では Arch パッケージを作成するときにトレースを取得したり、開発者にソフトウェアのバグを報告するのに役立つデバッグ情報を集める方法を解説します。
目次
パッケージの名前
以下のようなデバッグメッセージを見るとき:
[...] Backtrace was generated from '/usr/bin/epiphany' (no debugging symbols found) Using host libthread_db library "/lib/libthread_db.so.1". (no debugging symbols found) [Thread debugging using libthread_db enabled] [New Thread -1241265952 (LWP 12630)] (no debugging symbols found) 0xb7f25410 in __kernel_vsyscall () #0 0xb7f25410 in __kernel_vsyscall () #1 0xb741b45b in ?? () from /lib/libpthread.so.0 [...]
??
shows where debugging info is missing, as well as the name of library or executable which called the function. Similarly, when (no debugging symbols found)
appears, you should look for the stated file names. For example, with pacman:
# pacman -Qo /lib/libthread_db.so.1 /lib/libthread_db.so.1 is owned by glibc 2.5-8
The package is called glibc in version 2.5-8. Repeat this step for every package that needs debugging.
PKGBUILD
ソースからパッケージをビルドするには、PKGBUILD ファイルが必要です。公式リポジトリのパッケージについては ABS を、AUR のパッケージについては AUR#ビルドファイルを獲得 を見てください。
コンパイル設定
ここで、デバッグ目的でしか makepkg を使用しない場合は makepkg
のグローバルな設定ファイルを編集してください。そうではない場合は、リビルドしたいパッケージの PKGBUILD だけを修正してください。
一般
pacman 4.1 現在、/etc/makepkg.conf
のデバッグコンパイルフラグには DEBUG_CFLAGS
と DEBUG_CXXFLAGS
があります。これらを使うには、makepkg オプションの debug
を有効化して strip
を無効化してください。
OPTIONS+=(debug !strip)
以上の設定で強制的にデバッグ情報が表示されるようにコンパイルされ、実行可能ファイルのストリップが無効になります (strip
を無効化しても、デバッグ情報は生成されますが、別の foo-debug
パッケージに移動されます)。
この設定を一つのパッケージに適用するときは、PKGBUILD を修正してください:
options=(debug !strip)
Note that certain packages such as glibc are stripped regardless. Check the PKGBUILD for sections such as:
strip $STRIP_BINARIES usr/bin/{gencat,getconf,getent,iconv,iconvconfig} \ usr/bin/{ldconfig,locale,localedef,nscd,makedb} \ usr/bin/{pcprofiledump,pldd,rpcgen,sln,sprof} \ usr/lib/getconf/* [[ $CARCH = "i686" ]] && strip $STRIP_BINARIES usr/bin/lddlibc4 strip $STRIP_STATIC usr/lib/*.a strip $STRIP_SHARED usr/lib/{libanl,libBrokenLocale,libcidn,libcrypt}-*.so \ usr/lib/libnss_{compat,db,dns,files,hesiod,nis,nisplus}-*.so \ usr/lib/{libdl,libm,libnsl,libresolv,librt,libutil}-*.so \ usr/lib/{libmemusage,libpcprofile,libSegFault}.so \ usr/lib/{audit,gconv}/*.so
And remove them where appropriate.
Qt
In addition to the previous general settings, pass -developer-build
option to the configure
script in the PKGBUILD
. By default, -developer-build
passes -Werror
to the compiler, which may cause the compilation to fail. To avoid compilation errors, you may need pass -no-warnings-are-errors
, too.
KDE アプリケーション
KDE と関連するプログラムは基本的に cmake を使っています。-DCMAKE_BUILD_TYPE
を Debug
に変更してください。
パッケージのビルドとインストール
PKGBUILD のディレクトリから makepkg
を使ってソースからパッケージを作成します。多少時間がかかります:
# makepkg
そしてビルドしたパッケージをインストールしてください:
# pacman -U glibc-2.5-8-i686.pkg.tar.gz
トレースの取得
バックトレース (またはスタックトレース) は GNU Debugger gdb で取得できます。次を実行:
# gdb /path/to/file
または:
# gdb (gdb) exec /path/to/file
既に $PATH
変数に実行可能ファイルが設定されている場合はパスは必要ありません。
次に、gdb
の中で、起動したいプログラムに付けたい引数を付けて run
を入力します、例:
(gdb) run --no-daemon --verbose
これでファイルの実行が開始されます。バグが再現する操作を行なってください。ログを出力するには以下を入力:
(gdb) set logging file trace.log (gdb) set logging on
そして:
(gdb) thread apply all bt full
これで gdb
が起動したディレクトリの中の trace.log
にトレースが出力されます。終了するには、次を入力:
(gdb) set logging off (gdb) quit
実行中のアプリケーションをデバッグすることもできます、例:
# gdb --pid=$(pidof firefox) (gdb) continue
まとめ
Use the complete stack trace to inform developers of a bug you have discovered before. This will be highly appreciated by them and will help to improve your favorite program.