常用GDB除錯流程

2021-08-19 22:25:50 字數 4331 閱讀 5342

gdb ./檔名  ---file 檔名

以下為除錯狀態下的可以用到的命令(可以僅輸入單詞的輸入,如break可簡為b),尖括號中為說明  

list 《顯示源**》  ----l

break 行號 《設定斷點》  ---b

run 《執行程式》  ---r

continue 《繼續從斷點處執行》  ---c

print 變數 《除錯時檢視變數的值》  ---p

del 行號 《刪除斷點》  ---d

step 《單步執行,可跟蹤到函式內部》  ---s

next 《單步執行,不可跟蹤到函式內部》  ---n

quit 《退出》 ---q

命令解釋

示例file 《檔名》

載入被除錯的可執行程式檔案。

因為一般都在被除錯程式所在目錄下執行gdb,因而文字名不需要帶路徑。

(gdb) file gdb-sample

rrun的簡寫,執行被除錯的程式。

如果此前沒有下過斷點,則執行完整個程式;如果有斷點,則程式暫停在第乙個可用斷點處。

(gdb) r

ccontinue的簡寫,繼續執行被除錯程式,直至下乙個斷點或程式結束。

(gdb) c

b 《行號》

b 《函式名稱》

b *《函式名稱》

b *《**位址》

d [編號]

b: breakpoint的簡寫,設定斷點。兩可以使用「行號」「函式名稱」「執行位址」等方式指定斷點位置。

其中在函式名稱前面加「*」符號表示將斷點設定在「由編譯器生成的prolog**處」。如果不了解彙編,可以不予理會此用法。

d: delete breakpoint的簡寫,刪除指定編號的某個斷點,或刪除所有斷點。斷點編號從1開始遞增。

(gdb) b 8

(gdb) b main

(gdb) b *main

(gdb) b *0x804835c

(gdb) d

s, n

s: 執行一行源程式**,如果此行**中有函式呼叫,則進入該函式;

n: 執行一行源程式**,此行**中的函式呼叫也一併執行。

s 相當於其它偵錯程式中的「step into (單步跟蹤進入)」;

n 相當於其它偵錯程式中的「step over (單步跟蹤)」。

這兩個命令必須在有源**除錯資訊的情況下才可以使用(gcc編譯時使用「-g」引數)。

(gdb) s

(gdb) n

si, ni

si命令類似於s命令,ni命令類似於n命令。所不同的是,這兩個命令(si/ni)所針對的是彙編指令,而s/n針對的是源**。

(gdb) si

(gdb) ni

p 《變數名稱》

print的簡寫,顯示指定變數(臨時變數或全域性變數)的值。

(gdb) p i

(gdb) p nglobalvar

display ...

undisplay 《編號》

display,設定程式中斷後欲顯示的資料及其格式。

例如,如果希望每次程式中斷後可以看到即將被執行的下一條彙編指令,可以使用命令

「display /i $pc」

其中 $pc 代表當前彙編指令,/i 表示以十六進行顯示。當需要關心彙編**時,此命令相當有用。

undispaly,取消先前的display設定,編號從1開始遞增。

(gdb) display /i $pc

(gdb) undisplay 1

iinfo的簡寫,用於顯示各類資訊,詳情請查閱「help i」。

(gdb) i r

qquit的簡寫,退出gdb除錯環境。

(gdb) q

help [命令名稱]

gdb幫助命令,提供對gdb名種命令的解釋說明。

如果指定了「命令名稱」引數,則顯示該命令的詳細說明;如果沒有指定引數,則分類顯示所有gdb命令,供使用者進一步瀏覽和查詢。

(gdb) help display

#include

int globaltestcount = 0;//全域性變數初始化

int testfunction(int a, int b)

int main()

-c                       編譯、彙編到目標**,不進行鏈結。---處理多個檔案時一次性將所有中間檔案鏈結到可執行檔案,比如寫makefile 

-g   在編譯的時候,產生除錯資訊。 ---一般gdb除錯時使用

-o 《檔案》                輸出到 《檔案》

gcc -g gdbtest.c -o gdbtest

[root@localhost code]# ls

gdbtest.c

[root@localhost code]# gcc -g gdbtest.c  -o gdbtest

[root@localhost code]# ls

gdbtest  gdbtest.c

[root@localhost code]# gdb ./gdbtest

(gdb) l

1       #include

2       int globaltestcount = 0;//全域性變數初始化

3       int testfunction(int a, int b)

4      

8       int main()

9       {

10          int n =1;

(gdb) b main

breakpoint 1 at 0x80483f9: file gdbtest.c, line 10.

(gdb) i b

num     type           disp enb address    what

1       breakpoint     keep y   0x080483f9 in main at gdbtest.c:10

(gdb) r

starting program: /home/code/gdbtest 

breakpoint 1, main () at gdbtest.c:10

10          int n =1;

missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686

(gdb) n

11          n++;

(gdb) s

12          globaltestcount += 520;

(gdb) p n

$1 = 2

(gdb) n

13          printf("n = %d, globaltestcount = %d /n", n, globaltestcount );

(gdb) p globaltestcount

$2 = 520

(gdb) b  15

breakpoint 2 at 0x804844c: file gdbtest.c, line 15.

(gdb) i b

num     type           disp enb address    what

1       breakpoint     keep y   0x080483f9 in main at gdbtest.c:10

breakpoint already hit 1 time

2       breakpoint     keep y   0x0804844c in main at gdbtest.c:15

(gdb) d 1

(gdb) i b

num     type           disp enb address    what

2       breakpoint     keep y   0x0804844c in main at gdbtest.c:15

(gdb) c

continuing.

breakpoint 2, main () at gdbtest.c:15

15          printf("sum = %d", sum );

(gdb) n

16          return 0;

(gdb) p sum

$3 = 3

(gdb) c

continuing.

n = 2, globaltestcount = 520 /ntestfunction is called, a = 1, b = 2 /nsum = 3

program exited normally.

(gdb) 

gdb除錯多流程程式

預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的分別以及同時除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。設定方法 set follow fork...

GDB常用除錯命令

呼叫gdb編譯需要在cc後面加 g引數再加 o root redhat home gdb 除錯檔案 啟動gdb gdb l 字母l 從第一行開始列出原始碼 gdb break n 在第n行處設定斷點 gdb break func 在函式func 的入口處設定斷點 gdb info break 檢視斷...

gdb常用除錯命令

將.c檔案程式設計成包含標準除錯資訊的檔案 命令 gcc g c o 1 啟動gdb除錯程式 兩種方式 a gdb filename b 啟動gdb後,使用file filename 2 list l 檢視程式 方便設定斷點 3 break b 函式名 在某函式入口處新增斷點 4 break 行號 ...