gdb調試子進程


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,即處於調試狀態。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM