5

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は終了しており、通常の停止イベントではないため、それだけではいけません。まず別のプロセスに切り替える必要があります。gdbnon-stopoffcont

各下位出口で gdb の一時停止を停止する方法はありますか? 私はトリックを行うことを期待follow-fork-mode parentしていたでしょうが、劣ったものが終了すると停止したいようです.schedule-multiple ongdb

「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...そして、切り離されるか、殺されるまで進行しません。プロセスへのシグナルは無視され、interruptingdbは効果がありません。


GNU gdb (GDB) Fedora 7.7.1-18.fc20x86_64で使用しています。

4

2 に答える 2