linux gdb 命令
GDB(gnu Debugger)是 Linux 系統中廣泛使用的程序調試工具,它能幫助開發者:
GDB 支持多種語言,如 C、c++、Objective-C、Fortran、Ada 等,是 Linux 開發中不可或缺的調試工具。
安裝 gdb
在多數 Linux 發行版中,gdb 可通過包管理器直接安裝:
示例
# ubuntu/debian
sudo apt-get install gdb
# centos/RHEL
sudo yum install gdb
# Fedora
sudo dnf install gdb
# Arch Linux
sudo pacman -S gdb
安裝完成后,可使用以下命令驗證是否成功安裝:
gdb --version
生成可調試程序
要使用 gdb 進行調試,編譯時需添加 -g 參數以包含調試信息:
gcc -g program.c -o program
-g 參數會在可執行文件中嵌入源碼信息,方便 gdb 將機器指令與源代碼對應起來。
常用 gdb 命令
啟動和退出 gdb
示例
# 啟動 gdb 并加載程序
gdb ./program
# 附加到正在運行的進程
gdb -p PID
# 退出 gdb
(gdb) quit
# 或簡寫
(gdb) q
執行程序
示例
# 運行程序
(gdb) run
# 或簡寫
(gdb) r
# 帶參數運行
(gdb) run arg1 arg2
斷點設置
示例
# 在指定行號設置斷點
(gdb) break 10
# 或簡寫
(gdb) b 10
# 在函數入口設置斷點
(gdb) break main
(gdb) break function_name
# 查看所有斷點
(gdb) info breakpoints
# 刪除某個斷點
(gdb) delete 1 # 刪除編號為1的斷點
(gdb) delete # 刪除全部斷點
控制執行流程
示例
# 繼續運行直到下一個斷點
(gdb) continue
# 或簡寫
(gdb) c
# 單步進入函數
(gdb) step
# 或簡寫
(gdb) s
# 單步跳過函數
(gdb) next
# 或簡寫
(gdb) n
# 執行完當前函數并返回
(gdb) finish
查看源碼
示例
# 顯示當前行附近的代碼
(gdb) list
# 或簡寫
(gdb) l
# 顯示特定行號附近的代碼
(gdb) list 15
# 查看某個函數的代碼
(gdb) list main
查看變量與內存
示例
# 打印變量值
(gdb) print variable_name
# 或簡寫
(gdb) p variable_name
# 修改變量值
(gdb) print variable_name = new_value
# 查看變量類型
(gdb) ptype variable_name
# 查看內存數據
(gdb) x/10xw &variable # 以十六進制顯示10個字(word)
調用棧分析
示例
# 顯示調用棧
(gdb) backtrace
# 或簡寫
(gdb) bt
# 切換到特定棧幀
(gdb) frame 2
# 或簡寫
(gdb) f 2
高級調試技巧
條件斷點
示例
# 當 i 等于5時觸發斷點
(gdb) break 10 if i == 5
觀察點設置
示例
# 當變量被修改時暫停
(gdb) watch variable_name
# 當變量被讀取時暫停
(gdb) rwatch variable_name
# 當變量被讀或寫時暫停
(gdb) awatch variable_name
多線程調試
示例
# 查看所有線程
(gdb) info Threads
# 切換至指定線程
(gdb) thread 2
# 只允許當前線程運行
(gdb) set scheduler-locking on
調試核心轉儲文件
示例
# 加載 core dump 文件
gdb ./program core
# 查看崩潰時的調用棧
(gdb) bt
gdb 圖形界面模式
gdb 提供了圖形界面功能,可通過 -tui 參數啟動:
gdb -tui ./program
也可以在運行過程中切換界面布局:
示例
(gdb) layout src # 顯示源碼窗口
(gdb) layout asm # 顯示匯編窗口
(gdb) layout regs # 顯示寄存器窗口
(gdb) layout split # 同時顯示源碼和匯編
實用 gdb 配置
可以將常用配置寫入 ~/.gdbinit 文件中:
示例
# 啟用美觀輸出格式
set print pretty on
# 啟用歷史記錄保存
set history save on
set history size 1000
# 自定義打印數組命令
define printArray
set $i = 0
while $i printf “array[%d] = %dn”, $i, $arg1[$i]
set $i = $i + 1
end
end
常見問題處理
調試時無法顯示源碼
- 確保編譯時加了 -g 參數
- 檢查源碼路徑是否與編譯時一致
- 使用 Directory 添加源碼路徑:
(gdb) directory /path/to/source
調試優化后的代碼
優化會打亂執行順序,影響調試。建議關閉優化進行調試:
gcc -O0 -g program.c -o program
總結
gdb 是 Linux 下強大的調試工具,熟練掌握其使用能極大提升調試效率。本文介紹了 gdb 的基本操作和常用命令,建議讀者結合實踐加深理解。隨著經驗積累,你會發現 gdb 能應對各種復雜的調試場景。