一 除錯多程序
1) follow-fork-mode :
set follow-fork-mode [parent|child]
parent: fork之後繼續除錯父程序,子程序不受影響。
child: fork之後除錯子程序,父程序不受影響。
在使用如下方法設定完要除錯的程式後:
gdb命令列的 –-args 引數
gdb環境中 set args命令。
gdb --pid=pid(ps -ef | grep your_prog)
如果需要除錯子程序,在啟動gdb後:
(gdb) set follow-fork-mode child
並在子程序**設定斷點。
此外還有detach-on-fork引數,指示gdb在fork之後是否斷開(detach)某個程序的除錯,或者都交由gdb控制:
set detach-on-fork [on|off]
on: 斷開除錯follow-fork-mode指定的程序。
off: gdb將控制父程序和子程序。follow-fork-mode指定的程序將被除錯,另乙個程序置於暫停(suspended)狀態。
由於follow-fork-mode的除錯必然是從父程序開始的,對於fork多次,除錯起來並不方便。
2) attach除錯:
gdb有附著(attach)到正在執行的程序的功能,即attach 命令。因此可以利用該命令attach到子程序然後進行除錯。通過ps和pstree可以檢視到所要除錯的子程序pid。
問題是,子程序一直在執行,attach上去後都不知道執行到**了。乙個辦法是,在要除錯的子程序初始**中,加入一段特殊**,使子程序在某個條件成立時便迴圈睡眠等待,attach到程序後在該**段後設上斷點,再把成立的條件取消,使**可以繼續執行下去。
attach程序方法還是很方便的,它能夠應付各種各樣複雜的程序系統,比如孫子/曾孫程序,比如守護程序(daemon process),唯一需要的就是加入一小段**。適合於各種複雜情況,特別是守護程序。
專用於fork+exec模式,不用新增額外**,但需要x環境支援(xterm/vnc)。
可參考:
二 除錯多程序
gdb多執行緒除錯的基本命令:
info threads 檢視當前程序的執行緒。
thread 切換除錯的執行緒為指定id的執行緒。
break [location] [thread threadnum] [if condition] 在[location]處為[thread threadnum]設定斷點在滿足條件[if condition]時停住 。
set scheduler-locking off|on|step,這個是問得最多的。在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。
off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。
on 只有當前被除錯程式會執行。
step 在單步的時候,除了next過乙個函式的情況(熟悉情況的人可能知道,這其實是乙個設定斷點然後continue的行為)以外,只有當前執行緒會執行。
other:
gdb中的變數以$開頭,比如你想列印乙個陣列中的個個元素,你可以這樣:
(gdb) set $i = 0
(gdb) p a[$i++]
除錯巨集:在gcc編譯程式的時候,加上-ggdb3引數,就可以了
info macro – 你可以檢視這個巨集在哪些檔案裡被引用了,以及巨集定義是什麼樣的。
macro – 你可以檢視巨集展開的樣子。
x命令是用來檢視記憶體的,在gdb中 「help x」 你可以檢視其幫助。
x/x 以十六進製制輸出
x/d 以十進位制輸出
x/c 以單字元輸出
x/i 反彙編 – 通常,我們會使用 x/10i $ip-20 來檢視當前的彙編($ip是指令暫存器)
x/s 以字串輸出
command命令,其就是把一組gdb的命令打包,有點像字處理軟體的「巨集」。
(gdb) command 1
type commands for when breakpoint 1 is hit, one per line.
end with a line saying just "end".
>print arg1
>print arg2
>print arg3
>end
(gdb)
參考:
gdb除錯多程序多執行緒
1.除錯多程序預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的 分別以及同時 除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。接下來,首先介紹一下f...
gdb除錯多程序多執行緒
gdb是非常強大的unix及unix like下的程式除錯工具 gdb的使用 r或run 執行程式。list l 行號 顯示檔案源 接著上次的位置往下列,每次列10行。list l 函式名 列出某個函式的源 s或step 進入函式呼叫 breaktrace 或bt 檢視各級函式調 用及引數 info...
GDB 除錯多執行緒多程序
gdb是linux下的除錯利器,在c c 程式開發過程中必不可少的。這裡總結一下多程序和多執行緒的除錯方法和技巧。多程序的除錯 如下示例 include include include include include include static int glob 23 void test int ...