[Linux] GDB 和 CGDB的使用及理解


調(diào)試是軟件開發(fā)過程中必不可少的一部分。調(diào)試的主要目的是發(fā)現(xiàn)程序中的錯誤(Bug)以及理解程序的運行邏輯,從而確保程序正常運行。GDB 和 CGDB 是 Linux 系統(tǒng)中最流行的調(diào)試工具之一,它們強大且高效,適合各種調(diào)試場景。本文將深入探討這兩款工具的使用方法、調(diào)試技巧,以及應(yīng)對不同問題的具體操作。
什么是 Debug?
在軟件開發(fā)中,Debug 是指通過各種手段和工具,定位和修復(fù)程序中的問題。Debug 的核心目標(biāo)是:
- 發(fā)現(xiàn)錯誤:找出程序運行中產(chǎn)生的問題,例如變量值不對、程序崩潰等。
- 了解程序行為:通過分析程序運行時的狀態(tài),理解程序的實際行為是否符合預(yù)期。
- 提高程序健壯性:通過發(fā)現(xiàn)和修復(fù)問題,確保程序能在各種情況下正常工作。
Linux 系統(tǒng)中的調(diào)試工具以 GDB(GNU Debugger)為代表,它提供了對程序運行的全面控制,可以幫助開發(fā)者快速定位問題。CGDB 則是 GDB 的增強版,帶有代碼高亮和更直觀的界面,進一步提升了調(diào)試效率。
GDB 簡介與安裝
GDB 是什么?
GDB 是一個強大的命令行調(diào)試工具,支持多種編程語言(如 C、C++ 等)。通過 GDB,開發(fā)者可以:
- 設(shè)置斷點、監(jiān)控變量的值。
- 單步執(zhí)行代碼。
- 查看函數(shù)調(diào)用棧。
- 修改運行時的變量值。
安裝 GDB
在 Linux 系統(tǒng)中,GDB 通常已經(jīng)預(yù)裝。如果沒有安裝,可以使用以下命令安裝:
# 在 Ubuntu 上
sudo apt-get install -y gdb
# 在 CentOS 上
sudo yum install -y gdb
安裝完成后,通過以下命令驗證安裝:
gdb --version
CGDB 簡介與安裝
CGDB 是 GDB 的圖形化增強工具,其核心功能與 GDB 一致,但提供了更加直觀的界面,帶有代碼高亮功能,非常適合調(diào)試大型程序。
安裝 CGDB
在 Linux 系統(tǒng)中,可以通過包管理工具安裝 CGDB:
# 在 Ubuntu 上
sudo apt-get install -y cgdb
# 在 CentOS 上
sudo yum install -y cgdb
安裝完成后,運行 cgdb 命令即可啟動。
如何使用 GDB 進行調(diào)試
調(diào)試過程分為以下幾個關(guān)鍵步驟:
編譯時添加調(diào)試信息
在使用 GDB 調(diào)試程序前,必須確保程序在編譯時包含調(diào)試信息。這需要在編譯時加上 -g 選項:
gcc mycmd.c -o mycmd -g
不加 -g 編譯的程序無法進行調(diào)試。
啟動 GDB
通過以下命令啟動 GDB,并加載目標(biāo)程序:
gdb ./mycmd
啟動后會進入 GDB 的命令行交互界面。
常用調(diào)試命令
以下是 GDB 中的一些常用命令:
| 命令 | 功能 | 示例 |
|---|---|---|
list 或 l | 顯示源碼 | list main,list 10 |
run 或 r | 開始運行程序 | run |
break 或 b | 設(shè)置斷點 | break main,b 20 |
next 或 n | 單步執(zhí)行,不進入函數(shù) | next |
step 或 s | 單步執(zhí)行,進入函數(shù)內(nèi)部 | step |
continue 或 c | 從當(dāng)前位置繼續(xù)運行 | continue |
print 或 p | 打印變量值 | print x,p start+end |
set var | 修改變量值 | set var x=10 |
info break | 查看斷點信息 | info break |
delete 或 d | 刪除斷點 | delete 1,delete |
watch | 設(shè)置變量監(jiān)視點 | watch result |
backtrace 或 bt | 查看當(dāng)前調(diào)用棧 | backtrace |
GDB 實戰(zhàn)案例
案例 1:簡單調(diào)試
代碼示例(mycmd.c):
#include <stdio.h>
int Sum(int s, int e) {
int result = 0;
for (int i = s; i <= e; i++) {
result += i;
}
return result;
}
int main() {
int start = 1;
int end = 100;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\n", start, end, n);
return 0;
}
調(diào)試步驟:
- 編譯代碼:
gcc mycmd.c -o mycmd -g
- 啟動 GDB:
gdb ./mycmd
- 設(shè)置斷點:
(gdb) break main
- 開始運行程序:
(gdb) run

- 單步調(diào)試:
(gdb) next
- 查看變量值:
(gdb) print start
- 繼續(xù)執(zhí)行程序:
(gdb) continue

如何使用 CGDB
CGDB 的功能與 GDB 類似,但界面更加友好,代碼會自動高亮顯示。以下是 CGDB 的基本使用方法:
啟動 CGDB
運行 CGDB 并加載程序:
cgdb ./mycmd

使用快捷鍵操作
CGDB 支持大部分 GDB 命令,同時增加了一些快捷鍵操作:
- 按
Enter鍵:重復(fù)上一次命令。 - 按
Ctrl + c:切換至命令模式。 - 按
Ctrl + d:退出 CGDB。
CGDB 會在窗口上方顯示代碼,方便查看調(diào)試位置。
調(diào)試技巧與實戰(zhàn)
使用 Watchpoint 監(jiān)視變量
如果懷疑某個變量的值被錯誤修改,可以使用 watch 命令監(jiān)視該變量:
(gdb) watch result
程序運行時,變量 result 發(fā)生任何變化都會觸發(fā)暫停。

修改變量值
在調(diào)試時可以動態(tài)修改變量值以驗證問題原因:
(gdb) set var flag=1

條件斷點
可以為斷點添加條件,只在滿足特定條件時暫停:
(gdb) break 9 if i == 30
查看調(diào)用棧
如果程序崩潰或行為異常,使用 backtrace 查看函數(shù)調(diào)用棧,定位問題根源:
(gdb) backtrace
快速定位問題
- 使用
info locals查看當(dāng)前函數(shù)的所有局部變量。 - 使用
finish直接執(zhí)行到當(dāng)前函數(shù)結(jié)束。
總結(jié)
GDB 和 CGDB 是開發(fā)者調(diào)試程序的利器,它們提供了全面的調(diào)試功能,幫助開發(fā)者快速定位和解決問題。通過掌握設(shè)置斷點、變量監(jiān)視、條件斷點、修改變量值等技巧,可以應(yīng)對各種調(diào)試場景。在調(diào)試過程中,始終記住以下幾點:
- 善用斷點和條件斷點:提高調(diào)試效率。
- 觀察變量的變化:分析程序行為。
- 利用調(diào)用棧信息:定位問題根源。
希望本文能幫助你更好地掌握 GDB 和 CGDB,提升調(diào)試效率。

本文來自博客園,作者:DevKevin,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/kevinbee/p/18678185

浙公網(wǎng)安備 33010602011771號