gdb多執行緒 多程序(守護程序)除錯

2021-08-31 17:52:42 字數 2224 閱讀 3293

一 除錯多程序

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 ...