我正在使用gdb
非常方便的多重劣质支持来调试进程树:
(gdb) set detach-on-fork off
(gdb) set schedule-multiple on
(gdb) set follow-fork-mode parent
(gdb) break PostgresMain
(gdb) break PostmasterMain
现在需要让事情继续运行,直到我在一些尚未生成的次等中遇到未来的断点之一。
但是,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 次,在我在一个孩子的一个孩子的一个孩子的孩子中击中所需的断点之前。
我认为正在发生的事情是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
无效gdb
。
我GNU gdb (GDB) Fedora 7.7.1-18.fc20
在 x86_64 上使用。