「デバッグ/トレースを取得」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(update Pkg/AUR templates)
(同期)
1行目: 1行目:
 
[[Category:パッケージ開発]]
 
[[Category:パッケージ開発]]
 
[[en:Debug - Getting Traces]]
 
[[en:Debug - Getting Traces]]
  +
[[ru:Debug - Getting Traces]]
 
[[zh-hans:Debug - Getting Traces]]
 
[[zh-hans:Debug - Getting Traces]]
 
{{Related articles start}}
 
{{Related articles start}}
11行目: 12行目:
 
== パッケージの名前 ==
 
== パッケージの名前 ==
   
以下のようなデバッグメッセージを見とき:
+
以下のようなデバッグメッセージが表示され場合:
   
 
[...]
 
[...]
27行目: 28行目:
 
[...]
 
[...]
   
  +
{{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
 
# 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行目: 49行目:
 
OPTIONS+=(debug !strip)
 
OPTIONS+=(debug !strip)
   
以上の設定で強制的にデバッグ情報が表示されるようにコンパイルされ、実行可能ファイルのストリップが無効になります ({{ic|strip}} を無効化しても、デバッグ情報は生成されますが、別 {{ic|''foo''-debug}} パッケージに移動れます)。
+
以上の設定で強制的にデバッグ情報が表示されるようにコンパイルされ、実行可能ファイルからデバッグシンボルが排除されなくなります。特定のパッケージに適用するときは、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}} にインストールされます。デバッグパッケージについて詳しくは [https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html GDB のドキュメント] を参照してください。}}
  +
  +
''glibc'' など特定のパッケージは設定に関係なくデバッグ情報が取り除かれます。PKGBUILD の中を確認してください:
   
 
{{bc|<nowiki>
 
{{bc|<nowiki>
72行目: 75行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
そして必要であれば記述を削除してください。
And remove them where appropriate.
 
   
=== Qt ===
+
=== Qt4 ===
   
In addition to the previous general settings, pass {{ic|-developer-build}} option to the {{ic|configure}} script in the {{ic|PKGBUILD}}. By default, {{ic|-developer-build}} passes {{ic|-Werror}} to the compiler, which may cause the compilation to fail. To avoid compilation errors, you may need pass {{ic|-no-warnings-are-errors}}, too.
+
上記の汎用設定に加えて、{{ic|PKGBUILD}} {{ic|configure}} スクリプトに {{ic|-developer-build}} オプションを指定してください。デフォルトでは {{ic|-developer-build}} はコンパイラに {{ic|-Werror}} を渡すため、コンパイルが失敗するようになる可能性があります。そのような場合コンパイルエラーを防ぐために、{{ic|-no-warnings-are-errors}} も追加する必要があります。
   
  +
=== Qt5 ===
{{Note|
 
Compiling Qt with {{AUR|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 パッケージが入っています。[http://doc.qt.io/qt-5/debug.html 上流] の手順も参照。
# pacman -Rdd qtwebkit
 
 
Do not forget to install qtwebkit after the compilation of Qt is finished, otherwise the programs that depend on it will not work!
 
}}
 
   
=== KDE アプリケーション ===
+
=== CMAKE (KDE) アプリケーション ===
   
[[KDE]] と関連するプログラムは基本的に {{Pkg|cmake}} を使っています。{{ic|-DCMAKE_BUILD_TYPE}} を {{ic|Debug}} に変更してください。
+
[[KDE]] と関連するプログラムは基本的に {{Pkg|cmake}} を使っています。デバッグ情報を有効にして最適化を解除するには {{ic|-DCMAKE_BUILD_TYPE}} を {{ic|Debug}} に変更してください。最適化を有効にしたままデバッグ情報を有効にしたい場合は {{ic|-DCMAKE_BUILD_TYPE}} を {{ic|RelWithDebInfo}} に変更してください。
   
 
== パッケージのビルドとインストール ==
 
== パッケージのビルドとインストール ==
94行目: 93行目:
 
PKGBUILD のディレクトリから {{ic|makepkg}} を使ってソースからパッケージを作成します。多少時間がかかります:
 
PKGBUILD のディレクトリから {{ic|makepkg}} を使ってソースからパッケージを作成します。多少時間がかかります:
   
# makepkg
+
$ makepkg
   
 
そしてビルドしたパッケージをインストールしてください:
 
そしてビルドしたパッケージをインストールしてください:
143行目: 142行目:
 
== まとめ ==
 
== まとめ ==
   
  +
発見したバグを開発者に知らせるときは完全なスタックトレースを使ってください。プログラムの開発に役に立ちます。
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.
 
   
 
== 参照 ==
 
== 参照 ==
   
* [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]
 
* [http://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]

2017年8月14日 (月) 23:52時点における版

関連記事

この記事では 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_CFLAGSDEBUG_CXXFLAGS があります。これらを使うには、makepkg オプションの debug を有効化して strip を無効化してください。

OPTIONS+=(debug !strip)

以上の設定で強制的にデバッグ情報が表示されるようにコンパイルされ、実行可能ファイルからデバッグシンボルが排除されなくなります。特定のパッケージに適用するときは、PKGBUILD を修正してください:

options=(debug !strip)

もしくは別のパッケージで debugstrip を有効にして、メインのパッケージからデバッグ情報は取り除いて foo-debug パッケージでデバッグ情報を使うようにすることもできます。

ノート: 新しくコンパイルしたデバッグパッケージをインストールするだけでは不十分です。デバッガは関連するライブラリや実行ファイルと同じビルドからデバッグシンボルが含まれたファイルを確認するためです。再コンパイルしたパッケージを両方ともインストールしてください。Arch ではデバッグシンボルファイルは /usr/lib/debug にインストールされます。デバッグパッケージについて詳しくは GDB のドキュメント を参照してください。

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/*
[[ $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

そして必要であれば記述を削除してください。

Qt4

上記の汎用設定に加えて、PKGBUILDconfigure スクリプトに -developer-build オプションを指定してください。デフォルトでは -developer-build はコンパイラに -Werror を渡すため、コンパイルが失敗するようになる可能性があります。そのような場合コンパイルエラーを防ぐために、-no-warnings-are-errors も追加する必要があります。

Qt5

qt-debug リポジトリにはデバッグシンボルが含まれた Qt/PyQt パッケージが入っています。上流 の手順も参照。

CMAKE (KDE) アプリケーション

KDE と関連するプログラムは基本的に cmake を使っています。デバッグ情報を有効にして最適化を解除するには -DCMAKE_BUILD_TYPEDebug に変更してください。最適化を有効にしたままデバッグ情報を有効にしたい場合は -DCMAKE_BUILD_TYPERelWithDebInfo に変更してください。

パッケージのビルドとインストール

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
ヒント: Python で書かれているアプリケーションをデバッグするには:
# gdb /usr/bin/python
(gdb) run <python application>

実行中のアプリケーションをデバッグすることもできます、例:

 # gdb --pid=$(pidof firefox)
 (gdb) continue

まとめ

発見したバグを開発者に知らせるときは完全なスタックトレースを使ってください。プログラムの開発に役に立ちます。

参照