Linux中使用GDB除錯程式
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還有很多其他的除錯方法,比如不借助偵錯程式,在關鍵節點增加輸出提示,也可起到與偵錯程式一樣的作用。
相關文章
- Linux核心使用gdb除錯Linux除錯
- GDB 除錯程式碼除錯
- 使用GDB除錯Android Native 層程式碼除錯Android
- 用GDB除錯程式(六)除錯
- GDB除錯使用記錄除錯
- 在MacOS上使用gdb(cgdb)除錯Golang程式Mac除錯Golang
- Linux—gdb除錯簡單實現Linux除錯
- gdb除錯除錯
- C編譯: 使用gdb除錯編譯除錯
- gdb除錯正在執行的程式除錯
- GDB除錯指令除錯
- GDB除錯基礎使用方法除錯
- OpenHarmony系統使用gdb除錯init除錯
- gdb除錯多程序除錯
- gdb除錯總結除錯
- gdb除錯快速上手除錯
- Linux gdb偵錯程式用法全面解析Linux
- 利用QEMU+GDB搭建Linux核心除錯環境Linux除錯
- 嵌入式GDB除錯Linux C程式或交叉編譯(開發板)除錯LinuxC程式編譯
- C語言——gdb除錯C語言除錯
- 介紹 GDB 除錯 Go除錯Go
- GDB除錯命令詳解除錯
- gdb高階除錯命令高階除錯
- gdb除錯coredump檔案除錯
- c/c++ gdb 除錯帶引數的程式C++除錯
- 在海思晶片上使用GDB遠端除錯晶片除錯
- gdb除錯傳入引數除錯
- vscode 除錯linux程式VSCode除錯Linux
- NASM 與 GDB 簡易除錯指南ASM除錯
- Python 程式碼除錯—使用 pdb 除錯Python除錯
- 如何在Docker內部使用gdb偵錯程式Docker
- gdb除錯core dump檔案之二除錯
- GDB除錯-從入門到實踐除錯
- 在Docker內部使用gdb偵錯程式報錯-Operation not permittedDockerMIT
- 聊一聊 GDB 除錯程式時的幾個實用命令除錯
- 為什麼在Docker裡使用gdb偵錯程式會報錯Docker
- gdb多執行緒多程序除錯命令執行緒除錯
- 【Linux工具】-yum/gdb使用教程!Linux