Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
20.2.7. GDB でのフォーク用またはスレッド化されたプログラムのデバッグ
プログラムによっては、フォークまたはスレッドを使用して、コードの並行実行を実行します。複数の同時実行パスをデバッグするには、特別な留意点があります。
前提条件
- GDB デバッガーを理解していること
- フォークおよびスレッドプロセスのコンセプトを理解していること
GDB でのフォークされたプログラムのデバッグ
フォークとは、プログラム (親) により、独立したコピー (子) を作成する状況のことを指します。以下の設定およびコマンドを使用して、実行するフォークに対する GDB の対応を変更します。
follow-fork-mode
設定で、フォークの後に GDB が親または子に従うかどうかを制御します。set follow-fork-mode parent
- フォークの後に、親プロセスのデバッグを行います。これはデフォルトです。
set follow-fork-mode child
- フォークの後に、子プロセスのデバッグを行います。
show follow-fork-mode
-
follow-fork-mode
の現在の設定を表示します。
set detach-on-fork
設定では、GDB が (フォローしていない) 他のプロセスを制御するか、そのまま実行させるかを制御します。set detach-on-fork on
-
続いていないプロセス (
follow-fork-mode
の値により異なる) は切り離され、独立して実行されます。これはデフォルトです。 set detach-on-fork off
-
GDB は両方のプロセスの制御を維持します。フォローしているプロセス (
follow-fork-mode
の値による) は通常通りにデバッグされ、他は一時停止されます。 show detach-on-fork
-
detach-on-fork
の現在の設定を表示します。
GDB でのスレッド化されたプログラムのデバッグ
GDB には、個別のスレッドをデバッグして、独立して操作し、検査する機能があります。GDB が検査したスレッドのみを停止させるには、set non-stop on
コマンドおよび set target-async on
コマンドを使用します。これらのコマンドは、.gdbinit
ファイルに追加できます。その機能が有効になると、GDB がスレッドのデバッグを実行する準備が整います。
GDB は current thread の概念を使用します。デフォルトでは、コマンドは現在のスレッドのみに適用されます。
info threads
-
現在のスレッドを示す
id
番号およびgid
番号を使用してスレッドの一覧を表示します。 thread id
-
指定した
id
を現在のスレッドとして設定します。 thread apply ids command
-
command
コマンドを、ids
で一覧表示されたすべてのスレッドに適用します。ids
オプションは、スペースで区切られたスレッド ID の一覧です。特殊な値all
は、すべてのスレッドにコマンドを適用します。 break location thread id if condition
-
スレッド番号
id
に対してのみ特定のcondition
を持つ特定のlocation
にブレークポイントを設定します。 watch expression thread id
-
スレッド番号
id
に対してのみexpression
で定義されるウォッチポイントを設定します。 command&
-
command
コマンドを実行すると、GDB プロンプト(gdb)
に即座に戻り、バックグラウンドでコードの実行が続行されます。 interrupt
- バックグラウンドでの実行が停止されます。
関連資料
- GDB を使用したデバッグ: 4.10 Debugging Programs with Multiple Threads
- GDB を使用したデバッグ: 4.11 Debugging Forks