child on 只調試子進程,父進程不bolck
parent off 同時調試兩個進程,gdb跟主進程,子進程block在fork位置
child off 同時調試兩個進程,gdb跟子進程,主進程block在fork位置
查詢正在調試的進程: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
事件。
方法
4
:
info 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
。