一、GDB命令簡介
GDB是GNU Project Debugger的縮寫,是一種功能強大的源代碼調試器。它可以通過許多命令互動式地調試程序。下面介紹一些基本的GDB命令,並附上代碼示例。
二、GDB命令使用
1. 設置斷點
使用GDB調試程序的第一步通常是設置斷點,以便在適當的位置暫停程序。可使用如下兩個命令設置斷點:
b // 設置斷點 r // 運行程序
示例代碼:
#include int main(){ int a=1,b=2,c; c=a+b; printf("c=%d\n",c); return 0; }
使用上述代碼進行調試時,執行b命令後輸入參數main,執行r命令運行程序,當程序遇到breakpoint後停止執行。可以使用info命令查看斷點信息,使用delete命令刪除斷點。
2. 查看程序狀態
通過使用GDB,我們可以查看正在運行程序的狀態,以便了解程序運行時發生了什麼。下面是一些常用的命令:
- info 命令:查看程序的狀態
- print 命令:查看變數的值
- backtrace命令:查看函數調用鏈
示例代碼:
#include int main(){ int a=1,b=2,c; c=a+b; printf("c=%d\n",c); return 0; }
使用上述代碼進行調試時,執行r命令後可以使用print a命令查看變數a的值,可以使用info命令查看程序狀態,使用backtrace命令查看函數調用鏈。
3. 進行單步調試
單步調試是GDB的一項基本功能。它允許你一次一條地執行代碼並在執行途中檢查狀態。下面是一些可以使用的命令:
- step 命令:執行當前行,並進入函數、循環或條件語句
- next 命令:執行當前行,但是不進入函數、循環或條件語句
- finish命令:執行當前函數並返回調用它的函數
示例代碼:
#include int sub(int a,int b){ int c; c=a-b; return c; } int main(){ int a=1,b=2,c; c=sub(a,b); printf("c=%d\n",c); return 0; }
當使用上述代碼進行調試時,使用step命令可以進入函數sub,使用next命令可以退出函數,使用finish可以將程序運行到函數結尾處。
三、其他GDB命令
1. 調試崩潰程序
當程序發生崩潰時,調試起來會更加困難。但是,GDB可以幫助你確定問題發生的地方。我們可以使用如下命令來幫助我們進行調試:
- bt命令:查看函數調用鏈,幫助確定在哪個函數中發生了崩潰
- info registers 命令:查看寄存器中的值,幫助了解程序的狀態
- x/10i $eip命令:查看程序中指令的彙編語言代碼
示例代碼:
#include int main(){ int *p=NULL; *p=0; return 0; }
當使用上述代碼進行調試時,使用run命令啟動程序,在程序崩潰後使用bt命令可以查看函數調用鏈,使用info registers命令可以查看寄存器的值,使用x/10i $eip可以查看崩潰時程序中的指令。
2. 跟蹤變數值
GDB可以設置條件斷點,以便在變數值發生變化時暫停程序。下面是一個示常式序及其演示:
#include int main(){ int a=0,b=0,c=0; while(1){ a++; if(a>5){ b++; if(b>3){ c++; } } printf("a=%d,b=%d,c=%d\n",a,b,c); } }
使用如下代碼可以設置條件斷點:
b main.c:9 if a==5
這會在變數a的值等於5的時候停止程序,然後可以通過使用print命令來查看變數的值。
3. 模擬輸入
使用GDB,我們可以模擬輸入以便測試一些特定的情況。下面是一個示常式序及其演示:
#include int main(){ int a; printf("Please input your age:"); scanf("%d",&a); if(a<18){ printf("You are under 18.\n"); } else{ printf("You are over 18.\n"); } return 0; }
使用如下代碼可以使用GDB模擬輸入:
set args < input.txt run
以上代碼會將文件input.txt中的內容讀入程序中,並將其作為輸入。
四、總結
GDB是一個非常強大的源代碼調試器,它提供了許多功能幫助程序員定位代碼錯誤。有了GDB的幫助,調試程序變得更加簡單,並且大大提高了調試效率。
原創文章,作者:UAPNE,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332389.html