Linux調試工具GDB使用教程

本文主要介紹了linux調試工具gdb使用簡易教程,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下,希望能幫助到大家。

聲明:本博客內容是由本人經過實驗樓教程整理得來。

GDB的相關概念

GDB, 是 The gnu Project Debugger 的縮寫, 是 linux 下功能全面的調試工具。GDB 支持斷點、單步執行、打印變量、觀察變量、查看寄存器、查看等調試手段。在 Linux 環境軟件開發中,GDB 是主要的調試工具,用來調試 C 和 C++ 程序。

GDB的相關操作

下面給出一個具有buging.c的程序:

[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=%dn",res);  }

如果要調試程序,則在進行gcc編譯的時候要加上-g參數

gcc -g -o bugging bugging.c

進入gdb:

gdb buging

部分gdb命令:

Linux調試工具GDB使用教程

// 查看源碼  // 查看第幾行附近  // 可簡寫成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=%dn",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 列代表該斷點在源文件中的信息

// 刪除斷點  // 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.

disable +n //關閉斷點  enable +n  //啟動斷點

GDB單步調試

以本文開頭的buging.c文件為例,進行單步調試。

// 進入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是不進入函數內部的,要區分兩者的關系。

(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=%dn",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,執行程序到源代碼的某一行

相關推薦:

用GDB調試nginx

用GDB調試nginx

用GDB調試nginx

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享