GDB調試多進程、多線程

. 默認設置下,在調試多進程程序時GDB只會調試主進程。但是GDB(>V7.0)支持多進程的分別以及同時調試,換句話說,GDB可以同時調試多個程序。只需要設置follow-fork-mode(默認值:parent)和detach-on-fork(默認值:on)即可。
      follow-fork-mode  detach-on-fork   說明
parent                   on               只調試主進程(GDB默認),子進程不block
child                     on               只調試子進程,父進程不bolck
parent                   off              同時調試兩個進程,gdb跟主進程,子進程block在fork位置
child                     off              同時調試兩個進程,gdb跟子進程,主進程block在fork位置
   設置方法:set follow-fork-mode [parent|child]   set detach-on-fork [on|off]

   查詢正在調試的進程:info inferiors
   切換調試的進程: inferior <infer number>
   添加新的調試進程: add-inferior [-copies n] [-exec executable] ,可以用file executable來分配給inferior可執行文件。
   其他:remove-inferiors infno, detach inferior

2. GDB默認支持調試多線程,跟主線程,子線程block在create thread。
   查詢線程:info threads
   切換調試線程:thread <thread number>

Gdb調試多進程程序

程序經常使用fork/exec創建多進程程序。多進程程序有自己獨立的地址空間,這是多進程調試首要注意的地方。Gdb功能強大,對調試多線程提供很多支持。

方法1:調試多進程最土的辦法:attach pid

Attach是調試進程的常用辦法,只要有可執行程序以及相應PID,即可工作。當然,爲方便調試,可以在進程啓動後,設定sleep一段時間,如30s,這樣即可有充足的時間來attach。

方法2: set follow-fork-mode child + main斷點

當設置set follow-fork-mode child,gdb將在fork之後直接執行子進程,知道碰到斷點後停止。如何設置子進程的斷點呢?在父進程中是無法知道子進程的地址空間的(只有等程序載入後方可知)。Gdb提供一個很方便的機制:main函數的斷點將被子進程繼承(畢竟main是任何程序的入口)。

注意:程序在main停下後,可嘗試設置斷點。斷點是否有效,取決於gdb是否已經載入目標程序的地址空間。

方法3: set follow-fork-mode child + catch exec

Cache點是一種特殊的breakpoint。Gdb能夠catch的事件很多,如throw/catch/exception/syscall/exec/fork/vfork等。其中和多進程關係最大的就是exec/fork事件。


方法4info inferiors/inferiors [num]

設置set detach-on-fork off/set follow-exec-mode new

set detach-on-fork off/set follow-exec-mode new/info inferiors


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章