本文所述主要是Linux調試工具GDB的使用教程,具體如下。
聲明:本博客內容是由本人經過實驗樓教程整理得來。
GDB的相關概念
GDB, 是 The GNU Project Debugger 的縮寫, 是 Linux 下功能全面的調試工具。GDB 支持斷點、單步執行、打印變量、觀察變量、查看寄存器、查看堆棧等調試手段。在 Linux 環境軟件開發中,GDB 是主要的調試工具,用來調試 C 和 C++ 程序。
GDB的相關操作
下面給出一個具有buging.c的程序:
1
2
3
4
5
6
7
8
9
10
11
12
|
[yqtao@localhost linux]$ cat buging.c #include <stdio.h> int getSum( int n) { int sum=0,i; for (i=1;i<=n;i++) sum+=i; return sum; } int main(){ int res=getSum(100); printf ( "1+2+...+100=%d\n" ,res); } |
如果要調試程序,則在進行gcc編譯的時候要加上-g參數
gcc -g -o bugging bugging.c
進入gdb:
gdb buging
部分gdb命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
// 查看源碼 // 查看第幾行附近 // 可簡寫成l 2 (gdb) list 2 1 #include <stdio.h> 2 int getSum( int n) { 3 int sum=0,i; 4 for (i=1;i<=n;i++) 5 sum+=i; 6 return sum; 7 } // 查看main函數附近的源碼 (gdb) list main 3 int sum=0,i; 4 for (i=1;i<=n;i++) 5 sum+=i; 6 return sum; 7 } 8 int main(){ 9 int res=getSum(100); 10 printf ( "1+2+...+100=%d\n" ,res); 11 } // 設置斷點 // break +n在第幾行設斷點 (gdb) break 8 Breakpoint 1 at 0x4004fa: file buging.c, line 8. // break +函數名 ,在函數名處設斷點 (gdb) break getSum Breakpoint 2 at 0x4004cb: file buging.c, line 3. //查看斷點信息 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004004fa in main at buging.c:8 2 breakpoint keep y 0x00000000004004cb in getSum at buging.c:3 |
斷點信息中每一項的信息:
1.Num 列代表斷點編號,該編號可以作為 delete/enalbe/disable 等控制斷點命令的參數
2.Type 列代表斷點類型,一般為 breakpoint
3.Disp 列代表斷點被命中后,該斷點保留(keep)、刪除(del)還是關閉(dis)
4.Enb 列代表該斷點是 enable(y) 還是 disable(n)
5.Address 列代表該斷點處虛擬內存的地址
6.What 列代表該斷點在源文件中的信息
1
2
3
4
5
6
7
|
// 刪除斷點 // delete +n 或 d +n // 如果不加數字則刪除全部的斷點 (gdb) d 2 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004004fa in main at buging.c:8 |
關閉和啟用斷點:
有時候,我們會遇到這種情況:有些斷點可能暫時不用但又不想刪除,那么可以disable.
1
2
|
disable +n //關閉斷點 enable +n //啟動斷點 |
GDB單步調試
以本文開頭的buging.c文件為例,進行單步調試。
1
2
3
4
5
6
7
8
|
// 進入gdb [yqtao@localhost linux]$ gdb buging // 在main()函數處設斷點 (gdb) info breakpoints // 運行程序 (gdb) run Breakpoint 1, main () at buging.c:9 9 int res=getSum(100); |
注意:我們要進入函數要是用step(s),而單步執行next(n),next是不進入函數內部的,要區分兩者的關系。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
(gdb) step getSum (n=100) at buging.c:4 4 for (i=1;i<=n;i++) // 查看代碼 (gdb) l 1 #include <stdio.h> 2 int getSum( int n) { 3 int sum=0,i; 4 for (i=1;i<=n;i++) 5 sum+=i; 6 return sum; 7 } 8 int main(){ 9 int res=getSum(100); 10 printf ( "1+2+...+100=%d\n" ,res); // 下一步 (gdb) s 5 sum+=i; // 打印sum的值 // 看到sum是為賦初值的 (gdb) p sum $1 = 4195633 // info locals //打印當前斷點處所在函數的所有局部變量的值,不包括函數參數。 (gdb) info locals sum = 4195635 i = 3 |
其余的一些命令:
finish
執行程序到當前函數結束
continue
執行程序到下個斷點
until
until N,執行程序到源代碼的某一行
總結
以上就是本文關于Linux調試工具GDB使用簡易教程的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://blog.csdn.net/taoyanqi8932/article/details/53385022