「デバッグ/トレースを取得」の版間の差分
(ページの作成:「Category:パッケージ開発 en:Debug - Getting Traces zh-CN:Debug - Getting Traces {{Related articles start}} {{Related|一般的なトラブルシュー...」) |
(英語版と同期、非公式user repository 使い方はそのまま) |
||
(2人の利用者による、間の6版が非表示) | |||
1行目: | 1行目: | ||
[[Category:パッケージ開発]] |
[[Category:パッケージ開発]] |
||
[[en:Debug - Getting Traces]] |
[[en:Debug - Getting Traces]] |
||
− | [[ |
+ | [[pt:Debug - Getting Traces]] |
+ | [[ru:Debug - Getting Traces]] |
||
+ | [[zh-hans:Debug - Getting Traces]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|一般的なトラブルシューティング}} |
{{Related|一般的なトラブルシューティング}} |
||
11行目: | 13行目: | ||
== パッケージの名前 == |
== パッケージの名前 == |
||
− | 以下のようなデバッグメッセージ |
+ | 以下のようなデバッグメッセージが表示される場合: |
[...] |
[...] |
||
27行目: | 29行目: | ||
[...] |
[...] |
||
+ | {{ic|??}} はデバッグ情報が存在していないために関数を呼び出しているライブラリ・実行可能ファイルがわからないことを意味しています。同じように {{ic|(no debugging symbols found)}} と表示されたら、その下に出力されたファイルを確認してください。例えば [[pacman]] を使用して確認するには: |
||
− | {{ic|??}} shows where debugging info is missing, as well as the name of library or executable which called the function. Similarly, when {{ic|(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 |
/lib/libthread_db.so.1 is owned by ''glibc'' 2.5-8 |
||
+ | パッケージの名前は {{Pkg|glibc}} でバージョンが 2.5-8 とわかりました。デバッグが必要なパッケージの数だけ同じ手順を繰り返してください。 |
||
− | The package is called {{Pkg|glibc}} in version 2.5-8. Repeat this step for every package that needs debugging. |
||
== PKGBUILD == |
== PKGBUILD == |
||
48行目: | 50行目: | ||
OPTIONS+=(debug !strip) |
OPTIONS+=(debug !strip) |
||
− | 以上の設定で強制的にデバッグ |
+ | 以上の設定で強制的にデバッグシンボルを生成するようにコンパイルされ、実行可能ファイルからシンボルが排除されなくなります。特定のパッケージに適用するときは、PKGBUILD を修正してください: |
− | |||
− | この設定を一つのパッケージに適用するときは、PKGBUILD を修正してください: |
||
options=(debug !strip) |
options=(debug !strip) |
||
+ | もしくは別のパッケージで {{ic|debug}} と {{ic|strip}} を有効にして、メインのパッケージからデバッグシンボルは取り除き、ソースコードを用意込みでデバッガでステップ実行できるよう、 {{ic|''foo''-debug}} パッケージでデバッグ情報を使うようにすることもできます。 |
||
− | Note that certain packages such as ''glibc'' are stripped regardless. Check the PKGBUILD for sections such as: |
||
+ | |||
+ | {{Note|新しくコンパイルしたデバッグパッケージをインストールするだけでは不十分です。デバッガは関連するライブラリや実行ファイルと同じビルドからデバッグシンボルが含まれたファイルを確認するためです。再コンパイルしたパッケージを両方ともインストールしてください。Arch ではデバッグシンボルファイルは {{ic|/usr/lib/debug}} に、ソースコードは {{ic|/usr/src/debug}} にインストールされます。デバッグパッケージについて詳しくは [https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html GDB のドキュメント] を参照してください。}} |
||
+ | |||
+ | ''glibc'' など特定のパッケージは設定に関係なくデバッグ情報が取り除かれます。PKGBUILD の中を確認してください: |
||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
61行目: | 65行目: | ||
usr/bin/{pcprofiledump,pldd,rpcgen,sln,sprof} \ |
usr/bin/{pcprofiledump,pldd,rpcgen,sln,sprof} \ |
||
usr/lib/getconf/* |
usr/lib/getconf/* |
||
− | [[ $CARCH = "i686" ]] && strip $STRIP_BINARIES usr/bin/lddlibc4 |
||
strip $STRIP_STATIC usr/lib/*.a |
strip $STRIP_STATIC usr/lib/*.a |
||
72行目: | 75行目: | ||
</nowiki>}} |
</nowiki>}} |
||
+ | そして必要であれば記述を削除してください。 |
||
− | And remove them where appropriate. |
||
− | === |
+ | === Qt4 === |
− | + | 上記の汎用設定に加えて、{{ic|PKGBUILD}} の {{ic|configure}} スクリプトに {{ic|-developer-build}} オプションを指定してください。デフォルトでは {{ic|-developer-build}} はコンパイラに {{ic|-Werror}} を渡すため、コンパイルが失敗するようになる可能性があります。そのような場合コンパイルエラーを防ぐために、{{ic|-no-warnings-are-errors}} も追加する必要があります。 |
|
+ | === Qt5 === |
||
− | {{Note| |
||
− | Compiling Qt with {{Pkg|qtwebkit}} installed may cause compilation errors. Hence, remove qtwebkit package temporarily from your system. Use the following command in order to ignore any dependencies on qtwebkit. |
||
+ | [[非公式ユーザーリポジトリ#qt-debug|qt-debug]] リポジトリにはデバッグシンボルが含まれた Qt/PyQt パッケージが入っています。[https://doc.qt.io/qt-5/debug.html 上流] の手順も参照。 |
||
− | # pacman -Rdd qtwebkit |
||
+ | === CMAKE (KDE) アプリケーション === |
||
− | Do not forget to install qtwebkit after the compilation of Qt is finished, otherwise the programs that depend on it will not work! |
||
− | }} |
||
− | |||
− | === KDE アプリケーション === |
||
− | [[KDE]] と関連するプログラムは基本的に {{Pkg|cmake}} を使っています。{{ic|-DCMAKE_BUILD_TYPE}} を {{ic|Debug}} に変更してください。 |
+ | [[KDE]] と関連するプログラムは基本的に {{Pkg|cmake}} を使っています。デバッグ情報を有効にして最適化を解除するには {{ic|-DCMAKE_BUILD_TYPE}} を {{ic|Debug}} に、KDE アプリケーションでは {{ic|debugfull}} [https://community.kde.org/Guidelines_and_HOWTOs/Debugging/Debugging_symbols] に変更してください。最適化を有効にしたままデバッグ情報を有効にしたい場合は {{ic|-DCMAKE_BUILD_TYPE}} を {{ic|RelWithDebInfo}} に変更してください。 |
== パッケージのビルドとインストール == |
== パッケージのビルドとインストール == |
||
94行目: | 93行目: | ||
PKGBUILD のディレクトリから {{ic|makepkg}} を使ってソースからパッケージを作成します。多少時間がかかります: |
PKGBUILD のディレクトリから {{ic|makepkg}} を使ってソースからパッケージを作成します。多少時間がかかります: |
||
− | + | $ makepkg |
|
そしてビルドしたパッケージをインストールしてください: |
そしてビルドしたパッケージをインストールしてください: |
||
− | # pacman -U glibc-2. |
+ | # pacman -U glibc-2.26-1-x86_64.pkg.tar.gz |
== トレースの取得 == |
== トレースの取得 == |
||
140行目: | 139行目: | ||
# gdb --pid=$(pidof firefox) |
# gdb --pid=$(pidof firefox) |
||
(gdb) continue |
(gdb) continue |
||
+ | |||
+ | クラッシュしたアプリケーションをデバッグしたいときは、[[コアダンプ#コアダンプの確認|コアダンプ]]に対して gdb を起動すると良いでしょう。 |
||
== まとめ == |
== まとめ == |
||
+ | 発見したバグを開発者に知らせるときは完全なスタックトレースを使ってください。プログラムの開発に役に立ちます。 |
||
− | 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. |
||
== 参照 == |
== 参照 == |
||
+ | * [https://wiki.debian.org/HowToGetABacktrace Debian - How To Get a Backtrace] |
||
− | * [http://www.gentoo.org/proj/en/qa/backtraces.xml Gentoo Linux Documentation — How to get meaningful backtraces in Gentoo] |
||
+ | * [https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces Gentoo Wiki - Backtraces with Gentoo] |
||
− | * [http://fedoraproject.org/wiki/StackTraces Fedora - StackTraces] |
||
+ | * [https://fedoraproject.org/wiki/StackTraces Fedora - StackTraces] |
||
* [https://wiki.gnome.org/Community/GettingInTouch/Bugzilla/GettingTraces/Details#obtain-a-stacktrace GNOME - Getting Stack Traces] |
* [https://wiki.gnome.org/Community/GettingInTouch/Bugzilla/GettingTraces/Details#obtain-a-stacktrace GNOME - Getting Stack Traces] |
||
* [http://linux.bytesex.org/gdb.html gdb mini intro] |
* [http://linux.bytesex.org/gdb.html gdb mini intro] |
2019年6月11日 (火) 11:30時点における版
この記事では 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 [...]
??
はデバッグ情報が存在していないために関数を呼び出しているライブラリ・実行可能ファイルがわからないことを意味しています。同じように (no debugging symbols found)
と表示されたら、その下に出力されたファイルを確認してください。例えば pacman を使用して確認するには:
$ pacman -Qo /lib/libthread_db.so.1 /lib/libthread_db.so.1 is owned by glibc 2.5-8
パッケージの名前は glibc でバージョンが 2.5-8 とわかりました。デバッグが必要なパッケージの数だけ同じ手順を繰り返してください。
PKGBUILD
ソースからパッケージをビルドするには、PKGBUILD ファイルが必要です。公式リポジトリのパッケージについては ABS を、AUR のパッケージについては AUR#ビルドファイルを獲得 を見てください。
コンパイル設定
ここで、デバッグ目的でしか makepkg を使用しない場合は makepkg
のグローバルな設定ファイルを編集してください。そうではない場合は、リビルドしたいパッケージの PKGBUILD だけを修正してください。
一般
pacman 4.1 現在、/etc/makepkg.conf
のデバッグコンパイルフラグには DEBUG_CFLAGS
と DEBUG_CXXFLAGS
があります。これらを使うには、makepkg オプションの debug
を有効化して strip
を無効化してください。
OPTIONS+=(debug !strip)
以上の設定で強制的にデバッグシンボルを生成するようにコンパイルされ、実行可能ファイルからシンボルが排除されなくなります。特定のパッケージに適用するときは、PKGBUILD を修正してください:
options=(debug !strip)
もしくは別のパッケージで debug
と strip
を有効にして、メインのパッケージからデバッグシンボルは取り除き、ソースコードを用意込みでデバッガでステップ実行できるよう、 foo-debug
パッケージでデバッグ情報を使うようにすることもできます。
glibc など特定のパッケージは設定に関係なくデバッグ情報が取り除かれます。PKGBUILD の中を確認してください:
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/* 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
そして必要であれば記述を削除してください。
Qt4
上記の汎用設定に加えて、PKGBUILD
の configure
スクリプトに -developer-build
オプションを指定してください。デフォルトでは -developer-build
はコンパイラに -Werror
を渡すため、コンパイルが失敗するようになる可能性があります。そのような場合コンパイルエラーを防ぐために、-no-warnings-are-errors
も追加する必要があります。
Qt5
qt-debug リポジトリにはデバッグシンボルが含まれた Qt/PyQt パッケージが入っています。上流 の手順も参照。
CMAKE (KDE) アプリケーション
KDE と関連するプログラムは基本的に cmake を使っています。デバッグ情報を有効にして最適化を解除するには -DCMAKE_BUILD_TYPE
を Debug
に、KDE アプリケーションでは debugfull
[1] に変更してください。最適化を有効にしたままデバッグ情報を有効にしたい場合は -DCMAKE_BUILD_TYPE
を RelWithDebInfo
に変更してください。
パッケージのビルドとインストール
PKGBUILD のディレクトリから makepkg
を使ってソースからパッケージを作成します。多少時間がかかります:
$ makepkg
そしてビルドしたパッケージをインストールしてください:
# pacman -U glibc-2.26-1-x86_64.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
クラッシュしたアプリケーションをデバッグしたいときは、コアダンプに対して gdb を起動すると良いでしょう。
まとめ
発見したバグを開発者に知らせるときは完全なスタックトレースを使ってください。プログラムの開発に役に立ちます。