gdb是乙個強大的命令列除錯工具。大家知道命令列的強大就是在於,其可以形成執行序列,形成指令碼。unix下的軟體全是命令列的,這給程式開發提代供了極大的便利,命令列軟體的優勢在於,它們可以非常容易的整合在一起,使用幾個簡單的已有工具的命令,就可以做出乙個非常強大的功能。
一般來說,gdb主要幫忙你完成下面四個方面的功能:
1、啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式;
2、可讓被除錯的程式在你所指定的調置的斷點處停住;(斷點可以是條件表示式)
3、當程式被停住時,可以檢查此時你的程式中所發生的事;
4、動態的改變你程式的執行環境;
使用gdb除錯時,需要在編譯時使用-g引數
1、g++ -g test.cpp -o test
2、gdb ./test
常用命令
start #開始除錯,停在第一行**處,(gdb)start
l #list的縮寫檢視源**,(gdb) l [number/function]
b #b: breakpoint的簡寫,設定斷點。(gdb) b 10
b #b: breakpoint的簡寫,設定斷點。(gdb) b main
b filename:[line/function] #b:在檔案filename的某行或某個函式處設定斷點
i breakpoints #i:info 的簡寫。(gdb)i breakpoints
d [bpno] #d: delete breakpoint的簡寫,刪除指定編號的某個斷點,或刪除所有斷點。斷點編號從1開始遞增。 (gdb)d 1
s #s: step執行一行源程式**,如果此行**中有函式呼叫,則進入該函式;(gdb) s
n #n: next執行一行源程式**,此行**中的函式呼叫也一併執行。(gdb) n
r #run的簡寫,執行被除錯的程式。如果此前沒有下過斷點,則執行完整個程式;如果有斷點,則程式暫停在第乙個可用斷點處。(gdb) r
c #continue的簡寫,繼續執行被除錯程式,直至下乙個斷點或程式結束。(gdb) c
finish #函式結束
p [var] #print的簡寫,顯示指定變數(臨時變數或全域性變數 例如 int a)的值。(gdb) p a
display [var] #display,設定想要跟蹤的變數(例如 int a)。(gdb) display a
undisplay [varnum] #undisplay取消對變數的跟蹤,被跟蹤變數用整型數標識。(gdb) undisplay 1
set args #可指定執行時引數。(gdb)set args 10 20
show args #檢視執行時引數。
q #quit的簡寫,退出gdb除錯環境。(gdb) q
help [cmd] #gdb幫助命令,提供對gdb名種命令的解釋說明。如果指定了「命令名稱」引數,則顯示該命令的詳細說明;如果沒有指定引數,則分類顯示所有gdb命令,供使用者進一步瀏覽和查詢。(gdb)help
回車 #重複前面的命令,(gdb)回車
源程式:tst.c
#includeint func(int n)
return sum;
}main()
printf(「result[1-100] = %d /n」, result );
printf(「result[1-250] = %d /n」, func(250) );
}編譯生成執行檔案:(linux下)
ch3rry/test> cc -g tst.c -o tst
使用gdb除錯:
ch3rry/test> gdb tst <———- 啟動gdb
gnu gdb 5.1.1
gdb is free software, covered by the gnu general public license, and you are
welcome to change it and/or distribute copies of it under certain conditions.
type 「show copying」 to see the conditions.
there is absolutely no warranty for gdb. type 「show warranty」 for details.
this gdb was configured as 「i386-suse-linux」…
(gdb) l <——————– l命令相當於list,從第一行開始例出原碼。
1 #include
23 int func(int n)
4 10 return sum;
(gdb) <——————– 直接回車表示,重複上一次命令
11 }
1213
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
(gdb) break 16 <——————– 設定斷點,在源程式第16行處。
breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func <——————– 設定斷點,在函式func()入口處。
breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break <——————– 檢視斷點資訊。
num type disp enb address what
1 breakpoint keep y 0x08048496 in main at tst.c:16
2 breakpoint keep y 0x08048456 in func at tst.c:5
(gdb) r <——————— 執行程式,run命令簡寫
starting program: /home/hchen/test/tst
breakpoint 1, main () at tst.c:17 <———- 在斷點處停住。
17 long result = 0;
(gdb) n <——————— 單條語句執行,next命令簡寫。
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) n
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) c <——————— 繼續執行程式,continue命令簡寫。
continuing.
result[1-100] = 5050 <———-程式輸出。
breakpoint 2, func (n=250) at tst.c:5
5 int sum=0,i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p i <——————— 列印變數i的值,print命令簡寫。
$1 = 134513808
(gdb) n
8 sum+=i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
2=1(gdb)n8sum+=i;(gdb)pi3 = 2
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt <——————— 檢視函式堆疊。
0 func (n=250) at tst.c:5
1 0x080484e4 in main () at tst.c:24
2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish <——————— 退出函式。
run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf(「result[1-250] = %d /n」, func(250) );
value returned is $6 = 31375
(gdb) c <——————— 繼續執行。
continuing.
result[1-250] = 31375 <———-程式輸出。
program exited with code 027. <——–程式退出,除錯結束。
(gdb) q <——————— 退出gdb。
ch3rry/test>
參考: gdb除錯基本命令
gdb是乙個由gnu開源組織發布的 unix linux作業系統下的 基於命令列的 功能強大的程式除錯工具。對於一名linux下工作的c 程式設計師,gdb是必不可少的工具 對c c 程式的除錯,需要在編譯前就加上 g選項 g g hello.cpp o hello 除錯可執行檔案 gdb prog...
GDB除錯基本命令
一 列檔案清單 list l 列出產生執行檔案的源 的一部分 列出 line1 到 line2 行之間的源 gdb list line1,line2 輸出從上次呼叫list命令開始往後的10行程式 gdb list 輸出第 n 行附近的10行程式 gdb list n 輸出函式function前後的...
gdb除錯的基本命令
gdb除錯在編譯時必須要加 g選項 gcc g 輸入gdb進入gdb除錯環境。或者直接輸入gdb progfile來載入檔案。或者進入gdb環境後,通過命令file progfile來載入需要除錯的可 執行檔案檔案。常用命令行表 命令命令縮寫 命令說明 list l顯示多行源 break b設定斷點...