Linux下GDB調試工具完全指南:25個核心命令詳解與實戰示例
github地址
有夢想的電信狗
前言
GDB(GNU Debugger)
是Linux
開發中不可或缺的調試工具,尤其在定位代碼邏輯錯誤和內存問題時表現卓越。本文基于實際開發經驗,詳解25個高頻GDB命令,配合場景化案例和注意事項,助你快速掌握Linux調試核心技能。
我們以該代碼為例來進行gdb的演示,為了方便起見,代碼中標識了行號。
#include <stdio.h>2 3 int addToTop(int top){4 int res = 0;5 int i = 1;6 for(; i <= top; ++i){7 res += i;8 }9 return res;10 }11 12 int main(){13 printf("debug begin\n");14 15 int top = 100;16 int sum = addToTop(top);17 18 printf("sum is : %d\n", sum);19 20 printf("debug end\n");21 return 0;22 }
準備工作
- 程序的發布方式有兩種,
debug
模式和release
模式 - Linux
gcc/g++
出來的二進制程序,默認是release
模式 - 要使用
gdb
調試,必須在源代碼生成二進制程序的時候, 加上-g
選項
- 我們可以修改
makefile
中的依賴方法來進行-g
編譯
加上-g選項后,攜帶有調試信息,就可以用gdb進行調試了
gdb mycode # 開始調試該程序
1. 基礎調試命令
80%的指令都是圍繞定位問題產生的,打斷點就是找問題的一種方式
1.1 list/l 行號
描述:從指定行號開始顯示源代碼(默認顯示10行),接著上次的位置開始列出。
注意:需在編譯時添加-g
選項保留調試信息。
場景:快速定位代碼上下文。
(gdb) l 0 # 從該文件的開始顯示代碼
在gdb中,默認會記錄最近一次指令,因此連續回車會一直執行上一條指令。
1.2 list/l 函數名
描述:列出指定函數的完整源碼。
注意:函數需在當前加載的符號表中。
場景:查看函數實現細節。
(gdb) l addToTop # 顯示addToTop函數代碼
(gdb) l main # 顯示main函數代碼
2. 斷點管理
2.0 run/r
描述:從頭開始執行程序,直到斷點或程序結束。
注意:重復執行會重新加載程序。
場景:啟動調試或重新運行程序。
(gdb) r # 啟動程序
2.1 break/b 行號
描述:在指定行設置斷點。
注意:行號需在有效代碼范圍內。
場景:精準攔截問題發生點。
(gdb) b 15 # 在第15行設斷點
(gdb) b 16 # 在第16行設斷點
(gdb) b 21 # 在第21行設斷點
2.2 break/b 函數名
描述:在函數入口設置斷點。
注意:需確保函數已加載。
場景:監控特定函數調用。
(gdb) b addToTop # 在addToTop入口暫停
### 2.3 info break/b
描述:顯示所有斷點信息(編號/位置/啟用狀態)。
場景:查看當前斷點布局。
(gdb) info b # 顯示斷點列表
查看我們已設置的斷點信息:
2.4 delete/d breakpoints/b n
我們在刪除斷點時,不能刪除指定代碼行的斷點。
在我們使用info b
指令時,該指令為我們的斷點進行了編號,需要通過編號來刪除斷點。
描述:刪除指定編號的斷點。
注意:刪除后不可恢復。
場景:清理無效斷點。
(gdb) delete 1 # 刪除1號斷點
3.5 disable/enable breakpoints
有時會不想刪除這個斷點(因為要保留調試痕跡),但想讓這個斷點不工作(因為已經確認錯誤并不在當前斷點內),因此要對斷點進行使能
描述:臨時禁用/啟用斷點。
場景:保留斷點配置但不觸發。
(gdb) disable 1-3 # 禁用1-3號斷點
(gdb) enable 2 # 啟用2號斷點
- enable斷點指令如下
3. 單步調試與流程控制
2.1 next/n
描述:單步執行(不進入函數)相當于VS下的逐過程。
注意:跳過庫函數和用戶函數調用。
場景:快速跳過無需深入調試的代碼塊。
(gdb) n # 執行下一行
2.2 step/s
描述:單步執行(進入函數內部)。 相當于VS下的逐語句。
注意:可能跳入系統庫函數(如printf)。
場景:深入分析函數內部邏輯。
(gdb) s # 進入函數
如果代碼已經是基本的C語句了,n和s沒有區別,n不會跳過整個for循環
2.3 finish
描述:執行完當前函數并返回調用點。
注意:不能在main函數中使用。
場景:快速跳出復雜函數。
(gdb) finish # 執行到函數返回
- 進入了一個函數后,直接將該函數運行結束,直接查看該函數的運行結果,方便排除問題是否在該函數內
2.4 until X行號
until 直接運行到 x 行,跳過一定行數的代碼,便于直接定位問題
描述:跳轉到指定行繼續執行。
注意:目標行需在當前函數內。
場景:跳過循環中的已知安全代碼。
(gdb) until 30 # 跳轉到30行
2.5 continue/c
描述:跳轉到指定行繼續執行。
注意:目標行需在當前函數內。
場景:跳過循環中的已知安全代碼。
(gdb) continue
相當于VS中的F5 從當前位置,直接運行到下一個斷點處,如果中間出現了報錯,那么錯誤就在當前范圍內
4. 變量操作與堆棧分析
4.1 print/p 變量
描述:打印變量當前值。
注意:支持表達式計算。
場景:實時查看數據變化。
(gdb) p count # 顯示count值
(gdb) p arr[3] # 查看數組元素
4.2 set var
描述:修改運行中的變量值。
注意:類型需匹配。
場景:模擬異常數據測試。
(gdb) set var count=0 # 強制重置計數器
例如在循環中,i遞增100次,預判到可能在第95次遞增時出現問題,可以通過set var修改循環變量的值,直接跳到第95次遞增的過程
4.3 display 變量
描述:持續跟蹤變量(每次暫停自動顯示)。
場景:監控關鍵變量變化趨勢。
(gdb) display total # 持續顯示total變量
display
后左側會有變量編號,undisplay
取消變量跟蹤時,后面需要跟左側顯示的變量編號
4.4 info locals
查看當前函數棧內的局部變量
描述:顯示當前棧幀的所有局部變量。
場景:快速查看函數內部狀態。
(gdb) info locals # 列出當前函數局部變量
5. 高級調試技巧
5.1 backtrace/bt
查看各級函數的互相調用關系和傳參情況
描述:顯示函數調用棧(含參數)。
場景:分析崩潰時的調用鏈路。
(gdb) bt # 顯示調用堆棧
5.2 frame N
描述:切換到指定堆棧幀(配合bt使用)。
場景:查看上級調用者上下文。
(gdb) frame 2 # 查看第二層棧幀
5.3 watch 變量
描述:設置數據觀察點(變量修改時暫停)。
注意:僅對特定內存地址生效。
場景:定位意外修改問題。
(gdb) watch *0x7fffffffe234 # 監控內存地址
結語
不要認為gdb或VS等調試工具很先進,思考代碼邏輯或者printf信息也是調試方法,只要能快速方便的定位并解決問題,都是好方法
掌握GDB調試技能是Linux開發者的核心能力之一。本文涵蓋的25個命令已覆蓋90%日常調試場景,建議結合真實項目實踐加深理解。歡迎在評論區交流實戰經驗!
以上就是本文的所有內容了,如果覺得文章寫的不錯,還請留下免費的贊和收藏,也歡迎各位大佬在評論區交流
分享到此結束啦
一鍵三連,好運連連!