gdb調試命令及使用gdb調試core dump文件


  在我們寫代碼的過程中,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命令回溯追蹤,查看函數的調用情況
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM