gdb默認情況下,父進程fork一個子進程,gdb只會繼續調試父進程而不會管子進程的運行。
在一部分系統中(基於2.6內核的CentOS,支持follow-fork和detach-on-fork模式),比如HP-UX11.x之后的版本,Linux2.5.60之后的版本,可以使用以下的方法來達到方便的進行多進程調試功能。
1. 跟蹤子進程進行調試,可以使用set follow-fork-mode mode來設置fork跟隨模式。
1.1 show follow-fork-mode
進入gdb以后,我們可以使用show follow-fork-mode來查看目前的跟蹤模式。
1.2 set follow-fork-mode parent
gdb只跟蹤父進程,不跟蹤子進程,這是默認的模式。
1.3 set follow-fork-mode child
gdb在子進程產生以后只跟蹤子進程,放棄對父進程的跟蹤。
2. 想同時調試父進程和子進程,以上的方法就不能滿足了。Linux提供了set detach-on-fork mode命令來供我們使用
2.1 show detach-on-fork
show detach-on-fork顯示了目前是的detach-on-fork模式
2.2 set detach-on-fork on
只調試父進程或子進程的其中一個(根據follow-fork-mode來決定),這是默認的模式。
2.3 set detach-on-fork off
父子進程都在gdb的控制之下,其中一個進程正常調試(根據follow-fork-mode來決定),另一個進程會被設置為暫停狀態。
3.具體示例
show follow-fork-mode
set follow-fork-mode child
show detach-on-fork
set detach-on-fork off
4.其他方式
使用gdb調試多進程時,如果想要在進程間進行切換,那么就需要在fork調用前設置: set detach-on-fork off ,
然后使用 info inferiors 來查看進程信息,得到的信息可以看到最前面有一個進程編號,使用 inferior num 來進行進程切換。
那么為什么要使用 set detache-on-fork off 呢?它的意思是在調用fork后相關進程的運行行為是怎么樣的,是detache on/off ?
也就是說分離出去獨立運行,不受gdb控制還是不分離,被阻塞住。這里還涉及到一個設置 set follow-fork-mode [parents/child] ,
就是fork之后,gdb的控制落在誰身上,如果是父進程,那么分離的就是子進程,反之亦然。如果detache-on-fork被off了,
那么未受控的那個進程就會被阻塞住,進程狀態為T,即處於調試狀態。