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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎Debuginfod: 翻訳)
(同期)
68行目: 68行目:
 
/home/user/.cache/debuginfod_client/70e1b456c5813658df6436a3deb71812e75a0267/source##usr##src##debug##zstd-1.5.2##programs##fileio.c}}
 
/home/user/.cache/debuginfod_client/70e1b456c5813658df6436a3deb71812e75a0267/source##usr##src##debug##zstd-1.5.2##programs##fileio.c}}
   
  +
== デバッグ情報を手動で取得する ==
== Install debug packages ==
 
   
  +
最初に行うことは、[[デバッグ/トレースを取得#パッケージを再構築する|再構築が必です]] または [[デバッグ/トレースを取得#デバッグパッケージのインストール|デバッグパッケージのインストール]] のパッケージの名前を取得することです。
{{Note| Note the situation may have changed since {{#time:j. F Y|2 February 2022}} }}
 
{{Note| Debug packages are not archived by Arch Linux on [[Arch Linux Archive]] }}
 
   
  +
[...]
A few mirrors currently distribute debug packages in accessible repositories. These are sponsored mirrors controlled by Arch Linux and are given access to the debug repositories.
 
  +
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)'''
  +
[...]
   
  +
たとえば、トレースからの上記の抜粋の場合、関連するパッケージのパッケージ名は [[pacman]] で取得できます。
* https://america.mirror.pkgbuild.com
 
* https://asia.mirror.pkgbuild.com
 
* https://europe.mirror.pkgbuild.com
 
   
  +
{{hc|$ pacman -Qo /lib/libthread_db.so.1|
To install a package you can install it directly from the repository.
 
  +
/lib/libthread_db.so.1 is owned by ''glibc'' 2.5-8
  +
}}
   
  +
このパッケージは、バージョン 2.5-8 {{Pkg|glibc}} という名前です。デバッグ情報が必要なパッケージごとにこの手順を繰り返します。
# pacman -U https://''area''.mirror.pkgbuild.com/core-debug/os/x86_64/zstd-debug-1.5.2-2-x86_64.pkg.tar.zst
 
   
  +
=== デバッグパッケージをインストールする ===
Another option is to add the repositories to your pacman configuration.
 
   
  +
{{Note|デバッグパッケージは、Arch Linux によって [[Arch Linux Archive]] にアーカイブされません。}}
{{hc|1=/etc/pacman.conf|2=
 
[core-debug]
 
Server = https://''area''.mirror.pkgbuild.com/$repo/os/$arch
 
   
  +
現在、いくつかのミラーがアクセス可能なリポジトリにデバッグパッケージを配布しています。これらは Arch Linux によって制御されるスポンサー付きミラーであり、デバッグリポジトリへのアクセスが許可されています。
[extra-debug]
 
Server = https://''area''.mirror.pkgbuild.com/$repo/os/$arch
 
   
  +
* https://geo.mirror.pkgbuild.com (GeoDNS mirror)
[community-debug]
 
Server = https://''area''.mirror.pkgbuild.com/$repo/os/$arch
 
   
  +
パッケージをインストールするには、リポジトリから直接インストールできます。例えば:
[multilib-debug]
 
Server = https://''area''.mirror.pkgbuild.com/$repo/os/$arch
 
   
  +
# pacman -U <nowiki>https://geo.mirror.pkgbuild.com/core-debug/os/x86_64/</nowiki>''zstd-debug-1.5.2-2''-x86_64.pkg.tar.zst
  +
  +
{{Warning|両方のミラーが同期していない場合、1 つの [[ミラー]] からのデバッグパッケージは、別のミラーからの通常のパッケージと互換性がなく、ビルドが一致しません。この場合、異なるミラーからのパッケージを混合することは避けてください ([[部分アップグレード]] が発生します) ただし、すべてのリポジトリが {{ic|debug}} ミラーを指すようにしてください。}}
  +
  +
{{Merge|公式リポジトリ|公式リポジトリには、デバッグパッケージを配布する専用ページ|section=mirrors があります。}}
  +
  +
もう 1 つのオプションは、pacman 設定にリポジトリを追加することです。
  +
  +
{{hc|/etc/pacman.conf|2=
 
# Testing Repositories
 
# Testing Repositories
   
[testing-debug]
+
[core-testing-debug]
  +
Include = /etc/pacman.d/mirrorlist
Server = https://''area''.mirror.pkgbuild.com/$repo/os/$arch
 
   
[community-testing-debug]
+
[extra-testing-debug]
  +
Include = /etc/pacman.d/mirrorlist
Server = https://''area''.mirror.pkgbuild.com/$repo/os/$arch
 
   
 
[multilib-testing-debug]
 
[multilib-testing-debug]
  +
Include = /etc/pacman.d/mirrorlist
Server = https://''area''.mirror.pkgbuild.com/$repo/os/$arch
 
  +
  +
# Stable repositories
  +
  +
[core-debug]
  +
Include = /etc/pacman.d/mirrorlist
  +
  +
[extra-debug]
  +
Include = /etc/pacman.d/mirrorlist
  +
  +
[multilib-debug]
  +
Include = /etc/pacman.d/mirrorlist
 
}}
 
}}
   
  +
デバッグパッケージを含むミラーをミラーリストファイルの最初のミラーとして配置します。
{{Warning|Debug packages from one [[ミラー]] are not compatible with regular packages from another mirror, if both mirrors are not in sync, and thus have mismatching builds. In this case, avoid mixing packages from different mirrors (this would result in a [[部分アップグレード]]), but point all repositories to the {{ic|debug}} mirror.}}
 
  +
  +
{{hc|/etc/pacman.d/mirrorlist|2=
  +
Server = <nowiki>https://geo.mirror.pkgbuild.com/$repo/os/$arch</nowiki>
  +
...
  +
}}
   
  +
=== パッケージを再構築する ===
== Rebuild packages ==
 
   
  +
デバッグ情報が ''debuginfod'' を通じて公開されていない場合 (たとえば、パッケージが [[AUR]] から生成されている場合)、ソースから再構築できます。[[公式リポジトリ]] のパッケージについては [[ABS]] を、[[AUR]] のパッケージについては [[Arch User Repository#ビルドファイルを取得する]] を参照してください。
If debug information is not exposed through ''debuginfod'' (for example, when the package originates from the [[AUR]]), then it can be rebuilt from source. See [[ABS]] for packages in the [[公式リポジトリ]], or [[AUR#Acquire build files]] for packages in the [[AUR]].
 
   
 
ここで、デバッグ目的でしか makepkg を使用しない場合は {{ic|makepkg}} のグローバルな設定ファイルを編集してください。そうではない場合は、リビルドしたいパッケージの PKGBUILD だけを修正してください。
 
ここで、デバッグ目的でしか makepkg を使用しない場合は {{ic|makepkg}} のグローバルな設定ファイルを編集してください。そうではない場合は、リビルドしたいパッケージの PKGBUILD だけを修正してください。
   
=== コンパイル設定 ===
+
==== コンパイル設定 ====
   
 
pacman 4.1 現在、{{ic|/etc/makepkg.conf}} のデバッグコンパイルフラグには {{ic|DEBUG_CFLAGS}} と {{ic|DEBUG_CXXFLAGS}} があります。これらを使うには、makepkg オプションの {{ic|debug}} を有効化して {{ic|strip}} を無効化してください。
 
pacman 4.1 現在、{{ic|/etc/makepkg.conf}} のデバッグコンパイルフラグには {{ic|DEBUG_CFLAGS}} と {{ic|DEBUG_CXXFLAGS}} があります。これらを使うには、makepkg オプションの {{ic|debug}} を有効化して {{ic|strip}} を無効化してください。
132行目: 157行目:
 
{{Note|新しくコンパイルしたデバッグパッケージをインストールするだけでは不十分です。デバッガは関連するライブラリや実行ファイルと同じビルドからデバッグシンボルが含まれたファイルを確認するためです。再コンパイルしたパッケージを両方ともインストールしてください。Arch ではデバッグシンボルファイルは {{ic|/usr/lib/debug}} に、ソースコードは {{ic|/usr/src/debug}} にインストールされます。デバッグパッケージについて詳しくは [https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html GDB のドキュメント] を参照してください。}}
 
{{Note|新しくコンパイルしたデバッグパッケージをインストールするだけでは不十分です。デバッガは関連するライブラリや実行ファイルと同じビルドからデバッグシンボルが含まれたファイルを確認するためです。再コンパイルしたパッケージを両方ともインストールしてください。Arch ではデバッグシンボルファイルは {{ic|/usr/lib/debug}} に、ソースコードは {{ic|/usr/src/debug}} にインストールされます。デバッグパッケージについて詳しくは [https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html GDB のドキュメント] を参照してください。}}
   
==== Glibc ====
+
===== Glibc =====
   
 
''glibc'' など特定のパッケージは設定に関係なくデバッグ情報が取り除かれます。PKGBUILD の中を確認してください:
 
''glibc'' など特定のパッケージは設定に関係なくデバッグ情報が取り除かれます。PKGBUILD の中を確認してください:
153行目: 178行目:
 
そして必要であれば記述を削除してください。
 
そして必要であれば記述を削除してください。
   
==== Clang ====
+
===== Clang =====
   
Packages using [[Clang]] as the compiler will not build with the {{ic|debug}} option due to the debug flag {{ic|-fvar-tracking-assignments'}} not being handled (e.g. {{Pkg|js78}}).
+
[[Clang]] をコンパイラとして使用するパッケージは、デバッグフラグ {{ic|-fvar-tracking-assignments'}} が処理されないため、{{ic|debug}} オプションではビルドされません (例: {{Pkg|js78}})
   
  +
影響を受けるパッケージのフラグのみを削除するには、{{ic|build()}} 関数の先頭に次のコードを追加します。
Add the following at the top of the {{ic|build()}} function to only remove the flag for the affected package:
 
   
 
{{bc|1=
 
{{bc|1=
166行目: 191行目:
 
}}
 
}}
   
=== パッケージのビルドとインストール ===
+
==== パッケージのビルドとインストール ====
   
 
PKGBUILD のディレクトリから {{ic|makepkg}} を使ってソースからパッケージを作成します。多少時間がかかります:
 
PKGBUILD のディレクトリから {{ic|makepkg}} を使ってソースからパッケージを作成します。多少時間がかかります:
217行目: 242行目:
 
(gdb) continue
 
(gdb) continue
   
クラッシュしたアプリケーションをデバッグしたいときは、[[コアダンプ#コアダンプの確認|コアダンプ]]に対して gdb を起動すると良いでしょう。
+
クラッシュしたアプリケーションをデバッグしたいときは、[[コアダンプ#コアダンプの確認|コアダンプ]] に対して gdb を起動すると良いでしょう。
   
 
== 参照 ==
 
== 参照 ==

2023年10月15日 (日) 15:26時点における版

関連記事

この記事では 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 とわかりました。デバッグが必要なパッケージの数だけ同じ手順を繰り返してください。

デバッグ情報

公式リポジトリ でサポートしているパッケージ [1] では、debuginfod を使って HTTP で直接デバッグ情報を取得することができます。

gdb は、DEBUGINFOD_URLS 環境変数 が設定されている場合に、それらを自動的にダウンロードすることを提案します。 この変数はデフォルトで /etc/profile.d/ に設定されます。

$ gdb application
This GDB supports auto-downloading debuginfo from the following URLs:
  <https://debuginfod.archlinux.org>
Enable debuginfod for this session? (y or [n]) y
Debuginfod has been enabled.
To make this setting permanent, add 'set debuginfod enabled on' to .gdbinit.
Downloading separate debug info for /usr/bin/application
Reading symbols from /home/user/.cache/debuginfod_client/fbaee841e2ed2c11ecbbda26f39eeec1da23d6c3/debuginfo...

debuginfo サポートを有効にしたら、トレースの取得 に進むことができます。

マニュアルダウンロード

zstd のデバッグシンボルといくつかのソースファイルを手動で取得したい場合は、debuginfod-find を利用できます。

$ debuginfod-find debuginfo /usr/bin/zstd
/home/user/.cache/debuginfod_client/70e1b456c5813658df6436a3deb71812e75a0267/debuginfo
$ debuginfod-find source /usr/bin/zstd /usr/src/debug/zstd-1.5.2/programs/fileio.c
/home/user/.cache/debuginfod_client/70e1b456c5813658df6436a3deb71812e75a0267/source##usr##src##debug##zstd-1.5.2##programs##fileio.c

デバッグ情報を手動で取得する

最初に行うことは、再構築が必です または デバッグパッケージのインストール のパッケージの名前を取得することです。

[...]
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)
[...]

たとえば、トレースからの上記の抜粋の場合、関連するパッケージのパッケージ名は pacman で取得できます。

$ pacman -Qo /lib/libthread_db.so.1
/lib/libthread_db.so.1 is owned by glibc 2.5-8

このパッケージは、バージョン 2.5-8 glibc という名前です。デバッグ情報が必要なパッケージごとにこの手順を繰り返します。

デバッグパッケージをインストールする

ノート: デバッグパッケージは、Arch Linux によって Arch Linux Archive にアーカイブされません。

現在、いくつかのミラーがアクセス可能なリポジトリにデバッグパッケージを配布しています。これらは Arch Linux によって制御されるスポンサー付きミラーであり、デバッグリポジトリへのアクセスが許可されています。

パッケージをインストールするには、リポジトリから直接インストールできます。例えば:

# pacman -U https://geo.mirror.pkgbuild.com/core-debug/os/x86_64/zstd-debug-1.5.2-2-x86_64.pkg.tar.zst
警告: 両方のミラーが同期していない場合、1 つの ミラー からのデバッグパッケージは、別のミラーからの通常のパッケージと互換性がなく、ビルドが一致しません。この場合、異なるミラーからのパッケージを混合することは避けてください (部分アップグレード が発生します) ただし、すべてのリポジトリが debug ミラーを指すようにしてください。
この記事あるいはセクションは 公式リポジトリ と合併することが議論されています。
ノート: 公式リポジトリには、デバッグパッケージを配布する専用ページ (議論: トーク:デバッグ/トレースを取得#mirrors があります。)

もう 1 つのオプションは、pacman 設定にリポジトリを追加することです。

/etc/pacman.conf
# Testing Repositories

[core-testing-debug]
Include = /etc/pacman.d/mirrorlist

[extra-testing-debug]
Include = /etc/pacman.d/mirrorlist

[multilib-testing-debug]
Include = /etc/pacman.d/mirrorlist

# Stable repositories

[core-debug]
Include = /etc/pacman.d/mirrorlist

[extra-debug]
Include = /etc/pacman.d/mirrorlist

[multilib-debug]
Include = /etc/pacman.d/mirrorlist

デバッグパッケージを含むミラーをミラーリストファイルの最初のミラーとして配置します。

/etc/pacman.d/mirrorlist
Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch
...

パッケージを再構築する

デバッグ情報が debuginfod を通じて公開されていない場合 (たとえば、パッケージが AUR から生成されている場合)、ソースから再構築できます。公式リポジトリ のパッケージについては ABS を、AUR のパッケージについては Arch User Repository#ビルドファイルを取得する を参照してください。

ここで、デバッグ目的でしか 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 に、ソースコードは /usr/src/debug にインストールされます。デバッグパッケージについて詳しくは GDB のドキュメント を参照してください。
Glibc

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

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

Clang

Clang をコンパイラとして使用するパッケージは、デバッグフラグ -fvar-tracking-assignments' が処理されないため、debug オプションではビルドされません (例: js78)

影響を受けるパッケージのフラグのみを削除するには、build() 関数の先頭に次のコードを追加します。

build() {
  CFLAGS=${CFLAGS/-fvar-tracking-assignments}
  CXXFLAGS=${CXXFLAGS/-fvar-tracking-assignments}
[...]

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

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

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

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

クラッシュしたアプリケーションをデバッグしたいときは、コアダンプ に対して gdb を起動すると良いでしょう。

参照

翻訳ステータス: このページは en:Debugging/Getting traces の翻訳バージョンです。最後の翻訳日は 2022-02-03 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。