gdb
の非常に便利な多重劣等サポートを使用して、プロセスのツリーをデバッグしています。
(gdb) set detach-on-fork off
(gdb) set schedule-multiple on
(gdb) set follow-fork-mode parent
(gdb) break PostgresMain
(gdb) break PostmasterMain
そして、まだスポーンされていない下位のいくつかの将来のブレークポイントの1つに到達するまで、物事を実行させる必要があります。
ただし、gdb
下位が正常に終了するたびに一時停止するか、少なくとも親wait()
が戻ることができるように下位のクリーンアップをブロックしているようです。
(gdb) c
[New process 16505]
process 16505 is executing new program: /home/craig/pg/bdr/bin/pg_config
Reading symbols from /home/craig/pg/bdr/bin/pg_config...done.
[Inferior 2 (process 16505) exited normally]
(gdb) info inferior
Num Description Executable
* 2 <null> /home/craig/pg/bdr/bin/pg_config
1 process 16501 /usr/bin/make
(gdb) inferior 1
[Switching to inferior 1 [process 16501] (/usr/bin/make)]
[Switching to thread 1 (process 16501)]
#0 0x0000003bc68bc502 in __libc_wait (stat_loc=0x7fffffffbc78) at ../sysdeps/unix/sysv/linux/wait.c:30
30 return INLINE_SYSCALL (wait4, 4, WAIT_ANY, stat_loc, 0,
(gdb)
だから私は際限なくしなければなりません:
(gdb) inferior 1
(gdb) c
続けること。約 70 回、子の子の子で目的のブレークポイントに到達するまでに。
プロセスの終了を停止イベントとして扱い、 (デフォルト) に設定されているため、1 つのスレッドが停止すると、すべての下位クラスのすべてのスレッドが停止します。しかし、このinferiorは終了しており、通常の停止イベントではないため、それだけではいけません。まず別のプロセスに切り替える必要があります。gdb
non-stop
off
cont
各下位出口で gdb の一時停止を停止する方法はありますか? 私はトリックを行うことを期待follow-fork-mode parent
していたでしょうが、劣ったものが終了すると停止したいようです.schedule-multiple on
gdb
「skip proc-exit」のようなもの、または停止しないようにハンドラー ポリシーを変更できる仮想シグナルを探していると思います。
set non-stop on
正しい答えのように思えますが、複数の劣った人にとっては壊れていると思います。
を使用するnon-stop on
と、最初の終了トラップの後、gdb
の内部状態は下位 1 が実行中であることを示します。
(gdb) info inferior
Num Description Executable
* 1 process 20540 /usr/bin/make
(gdb) info thread
Id Target Id Frame
* 1 process 20540 "make" (running)
(gdb) cont
Continuing.
Cannot execute this command while the selected thread is running.
しかし、カーネルはそれをブロックされていると見なしますptrace_stop
:
$ ps -o "cmd,wchan" -p 20540
CMD WCHAN
/usr/bin/make check ptrace_stop
gdb
...そして、切り離されるか、殺されるまで進行しません。プロセスへのシグナルは無視され、interrupt
ingdb
は効果がありません。
GNU gdb (GDB) Fedora 7.7.1-18.fc20
x86_64で使用しています。