Linux中使用GDB除錯程式

TAOTAO_Z發表於2020-10-30

gdb的簡介及在linux中的使用


一、gdb簡介及常用命令介紹

1、什麼是gdb
GDB : GNU Debugger,是GNU工程為GNU作業系統開發的 偵錯程式,但它的使用不侷限於GNU作業系統, GDB可以執行 在UNIX、Linux甚至Microsoft Windows。
GDB可以除錯C、C++、Objective-C、Pascal、Ada等語言編寫的程式;被除錯的程式可以跟GDB執行於同一臺電腦,也可 執行於不同電腦。 使用GDB我們可以: – 設定斷點使程式停住 – 監視或修改程式中變數的值 – 跟蹤程式碼執行過程

2、常用命令介紹

  • file 裝入想要除錯的可執行檔案。
  • kill 終止正在除錯的程式。
  • list 列出產生執行檔案的原始碼的一部分。
  • next 執行一行原始碼但不進入函式內部。
  • step 執行一行原始碼而且進入函式內部。
  • run 執行當前被除錯的程式。
  • c 繼續執行程式。
  • quit 終止gdb。
  • watch 使你能監視一個變數的值而不管它何時被改變。
  • backtrace 棧跟蹤,查出程式碼被誰呼叫。
  • print 檢視變數的值。
  • make 使你能不退出gdb就可以重新產生可執行檔案。
  • shell 使你能不離開gdb就執行UNIX shell命令。
  • whatis 顯示變數或函式型別。
  • break 在程式碼裡設斷點,這將使程式執行到這裡時被 掛起。
  • info break 顯示當前斷點清單,包括到達斷點處的次數等。
  • info files 顯示被除錯檔案的詳細資訊。
  • info func 顯示所有的函式名稱。
  • info local 顯示當函式中的區域性變數資訊。
  • info prog 顯示被除錯程式的執行狀態。
  • delete [n] 刪除第n個斷點。
  • disable[n] 關閉第n個斷點。
  • enable[n] 開啟第n個斷點。
  • ptype 顯示結構定義。
  • set variable 設定變數的值。
  • call name(args) 呼叫並執行名為name,引數為args的函式。
  • Finish 終止當前函式並輸出返回值。
  • return value 停止當前函式並返回value給呼叫者。
  • break命令的使用 – 根據行號設定斷點:
    (gdb) break linenum – 根據函式名設定斷點:
    (gdb) break funcname – 執行非當前原始檔的某行或某函式時停止執行:
    (gdb) break filename:linenum
    (gdb) break filename:funcname – 根據條件停止程式執行:
    (gdb) break linenum if expr
    (gdb) break funcname if expr

二、gdb除錯例項

編譯程式時,通過gcc的-g選項為程式新增除錯資訊
例如:gcc –g –o helloworld helloworld.c

1、建立需要除錯的程式檔案 main.c

  • 下面的程式碼實現對一個整型數的反轉功能,比如輸入123,則 輸出321。但輸入100時,程式的輸出結果卻不正確,請找出問題。
#include <stdio.h> 
void ShowRevertNum(int iNum) 
{
	while (iNum > 10)         
	{ 
		printf("%d", iNum % 10);                 
		iNum = iNum / 10;         
	}         
	printf("%d\n", iNum); 
} 
int main(void) 
{         
	int iNum;         
	printf("Please input a number :");         
	scanf("%d", &iNum);         
	printf("After revert : ");         
	ShowRevertNum(iNum); 
} 

2、編譯程式,新增除錯資訊

gcc -g -o main2 main2.c

在這裡插入圖片描述
3、除錯

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
由以上除錯過程,我們現在程式中設定兩個斷點,用info檢視斷點資訊後,開始run除錯,使用命令c進行下一步,跳到函式斷點,使用 s 進行單步除錯,可以看到程式只執行了一次迴圈中的語句,便執行完畢,但我們需要執行兩次迴圈,所以是迴圈控制條件有了問題,應該改為(iNum>=10)。

可見除錯在程式編寫過程中起著很重要的作用,方便我們將複雜問題簡單分析,逐步找出問題所在。除了gdb還有很多其他的除錯方法,比如不借助偵錯程式,在關鍵節點增加輸出提示,也可起到與偵錯程式一樣的作用。

相關文章