在我們寫代碼的過程中,Bug是不可避免的.為了找出這寫BUG,我們常常需要借助調試工具.在Windows下,我們可以借助各種各樣的IDE來進行調試,例如visual studio,visual code,codeblocks等.在Linux平台下,同樣也有調試工具,今天這篇博文就來介紹Linux下面被廣泛使用的調試工具--GDB。gdb是GNU組織發布的Linux平台下的調試工具,主要用來調試C/C++程序。通過GDB可以獲取很多程序運行時基本信息,幫助我們定位錯誤。
我們調試程序時大致要干什么?
之所以要調試程序,是因為程序的運行結果和預期結果不一致,或者程序出現運行時出現錯誤。因為當前的報錯信息無法幫我們發現錯誤,所以需要更多的信息來定位錯誤,調試就是個獲取信息,幫助定位錯誤的過程。
調試的基本流程可以總結為:
下面我們來看看GDB怎么幫我們實現這些步驟:
啟動gdb
為了使用gdb,需要在編譯程序時添加-g選項,使執行文件包含調試信息.
gcc -g main.c -o filename
在命令行中鍵入gdb,即可啟動gdb,要使用gdb調試某可執行文件,只需要在gdb后加上文件名即可.
gdb filename
查看代碼
list 或 l
list linenum 根據行號查看源碼
list functionname 根據函數名查看源碼
進行調試的時候,我們有的時候會希望一邊查看源代碼,一邊調試,使用list或l命令可以查看源代碼(默認)是10行。在后面加參數可以定位到具體的行數。gdb中,按ENTER時會執行上一行命令,所以要持續查看只需要不停按ENTER就行了。
命令 | 作用 |
list | 顯示當前行之后的源程序 |
layout | 用於分割窗口,一邊查看代碼,一邊調試 |
這樣子看肯定不方便,在GDB中可以使用layout,一邊查看代碼,一邊調試。
layout src 查看源碼
layout asm 查看匯編窗口
layout regs 查看寄存器與匯編窗口
layout split 查看源碼與匯編窗口
使用layout還可以查看匯編和寄存器窗口:
layout prev 切換到上一個窗口 layout next 切換到下一個窗口
focus winname 將視角聚集在某窗口上,winname為窗口名字
有一些快捷鍵可以幫助我們切換:
CTRL + X 再按1 單窗口模式,顯示一個窗口 CTRL + X 再按2 雙窗口模式,顯示兩個窗口 CTRL + X 再按a 退出layout
2. 設置斷點
斷點,是所有調試器的重要調試功能,可以讓程序中斷在指定的地方,便於分析,在gdb中可以使用break或者b設置斷點。
break 或者 b 設置斷點
break linename 在某行設置斷點
break functionname 在某函數入口處設置斷點
info breakpoints [n] 可以查看某個斷點的具體信息
3. 執行
命令 | 作用 |
run或r | 開始從頭運行當前程序,直到出現斷點 |
step或s | 執行當前語句,如果遇上調用的函數,則進入函數當中 |
next或n | 執行當前語句,如果遇上調用的函數,則進入函數當中 |
cont或c | 繼續程序的運行,直到出現下一個斷點 |
4 查看變量信息
命令 | 作用 |
print var | 顯示變量var的值 |
display var | 運行時自動顯示var的值 |
watch var | 設置var為觀察者,當該變量發生變化時,停止運行 |
5. 追蹤調用信息
命令 | 作用 |
backtrace或bt | 回溯查找函數的調用棧,定位錯誤 |
frame n | 定位源代碼中的錯誤,n代表忽略前幾行 |
6.其他
命令 | 作用 |
set args | 為程序的運行設置參數 |
info | 列出關於命令的信息 |
disable | 禁用設置 |
quit | 退出 |
7. 修改程序中的邏輯
命令 | 作用 |
set variable | 修改臨時變量的值 |
jump | 跳轉執行 |
signal | 產生信號量給正在調試的程序 |
return | 強制函數返回 |
call | 強制調用程序中的函數 |
對core dump進行調試
core dump是什么
core dump是Linux系統下程序崩潰時,系統產生的文件,中文叫做轉儲文件.它相當於會記錄下發生錯誤時,進程空間中內存的信息映射.通過對這些信息進行調試,我們可以了解為什么系統會發生錯誤.
產生core dump的原因
一般來說,出現core dump往往是出現了內存錯誤,包括下面幾種情況:
- 訪問空指針
- 內存訪問越界
- 堆棧溢出
開啟core dump調試
Linux系統默認是不產生core dump文件的,因為如果產生的core dump文件過大,就是很大的存儲負擔,所以在程序上線的過程中,默認不產生core dump文件.在調試階段,可以使用ulimit命令產生core dump文件
ulimit -c unlimited // unlimited代表不限制產生core文件的內存大小
如何調試core dump
就像調試普通可執行文件一樣,可以使用gdb+執行文件名+core dump文件名調試core dump文件
gdb filename coredumfilename
執行該命令后,gdb會顯示錯誤出現在filename中的第幾行,然后,可以用backtrace命令回溯追蹤,查看函數的調用情況