多數Linux發行版默認安裝GDB,若未安裝,可通過包管理器安裝(如Ubuntu使用sudo apt install gdb,CentOS使用sudo yum install gdb)。
調試前需為程序添加調試信息(包含變量名、源代碼行號等),編譯時需加入-g參數。例如:
gcc -g program.c -o program(C程序)或g++ -g program.cpp -o program(C++程序)。
注意:避免使用-O(優化)參數,否則會干擾調試(如變量被優化掉,無法查看)。
在終端輸入以下命令啟動GDB并加載可執行文件:
gdb ./program
成功啟動后,會進入GDB交互界面(提示符為(gdb))。
斷點是調試的核心工具,用于讓程序在指定位置暫停,方便檢查狀態。常見用法:
break main(在main函數開頭暫停);break file.c:10(在file.c文件的第10行暫停);break file.c:10 if x == 5(當變量x等于5時,在第10行暫停)。設置斷點后,使用run(或簡寫r)命令啟動程序。若程序需要命令行參數,可緊跟參數:
run arg1 arg2(將arg1、arg2作為程序的輸入參數)。
程序暫停后,可通過以下命令控制執行流程:
next(或簡寫n):執行下一行代碼,不進入函數內部(適合快速跳過函數調用);step(或簡寫s):執行下一行代碼,進入函數內部(適合跟蹤函數內部的邏輯);finish:執行完當前函數,暫停在函數返回處(無需逐行執行函數內的代碼)。print x(打印變量x的當前值);print /x x(以十六進制格式顯示變量x的值);display x(每次程序暫停時,自動打印變量x的值)。使用backtrace(或簡寫bt)命令,顯示當前函數的調用順序(從main函數到當前函數),幫助定位崩潰發生的位置(如“段錯誤”通常源于非法內存訪問)。
list(或簡寫l);list main(查看main函數的代碼);list 10(查看第10行附近的代碼)。調試時,可通過以下命令動態修改變量值,無需重新編譯程序,快速驗證假設:
set variable x = 10(將變量x的值修改為10);x/8xb &x(以十六進制查看變量x的內存布局,8表示顯示8個字節,x表示十六進制格式)。使用continue(或簡寫c)命令,讓程序從當前暫停位置繼續執行,直到遇到下一個斷點或程序結束。
調試完成后,使用quit(或簡寫q)命令退出GDB,返回終端。
使用x命令查看指定內存地址的內容,格式為x/<數量><格式><大小> <地址>。例如:
x/4xb 0x7fffffffe000(查看從地址0x7fffffffe000開始的4個字節,以十六進制格式顯示)。
當程序崩潰時,系統會生成Core文件(記錄崩潰時的內存狀態),使用以下命令調試:
ulimit -c unlimited(解除Core文件大小限制);gdb ./program core(加載Core文件,查看崩潰時的調用棧)。對于多線程程序,可使用以下命令:
info threads(顯示線程ID、狀態等信息);thread 2(切換到線程ID為2的線程);break file.c:10 thread 2(僅在線程2執行到第10行時暫停)。通過以上步驟,可系統性地使用GDB調試Linux進程,快速定位邏輯錯誤、崩潰、死循環等問題。實踐中需結合具體場景靈活運用,如通過watch命令監控變量變化、通過disassemble命令查看匯編代碼等。