
GDB是Linux下非常好用且強大的調試工具。GDB可以調試C、C++、Go、java、 objective-c、PHP等語言。對于一名Linux下工作的c/c++程式員,GDB是必不可少的工具,本篇以C語言來調試。
GDB簡介UNIX及UNIX-like下的調試工具。雖然它是指令行模式的調試工具,但是它的功能強大到你無法想象,能夠讓使用者在程式運作時觀察程式的内部結構和記憶體的使用情況。
一般來說,GDB主要幫助你完成下面四個方面的功能:
1
基本指令的操作 GDB中的指令很多,但我們隻需掌握其中十個左右的指令,就大緻可以完成日常的基本的程式調試工作。
gdb指令擁有較多内部指令。在gdb指令提示符“(gdb)”下輸入“help”可以檢視所有内部指令及使用說明。
要調試C/C++的程式,首先在編譯時,要使用gdb調試程式,在使用gcc編譯源代碼時必須加上“-g”參數。保留調試資訊,否則不能使用GDB進行調試。
有一種情況,有一個編譯好的二進制檔案,你不确定是不是帶有-g參數,帶有GDB調試,這個時候你可以使用如下的指令驗證:
如果沒有調試資訊,則會出現:
Reading symbols from /home/minger/share/tencent/gdb/main…(no debugging symbols found)…done.
/home/minger/share/tencent/gdb/main是程式的路徑。
如果帶有調試功能,下面會提示:
Reading
說明可以進行GDB調試。
還有使用指令readlef檢視可執行檔案是否帶有調試功能
readelf -S main|grep debug
如果有debug說明有調試功能,如果沒有debug。說明沒有帶有調試功能,則不能被調試。
開始進入正題,GDB啟動調試。
調試方式啟動運作無參程式以下是linux下GDB調試的一個執行個體,先給出一個示例用的小程式,C語言代碼:
main.c
#include
編譯:
gcc
下面“gdb”指令啟動GDB,将首先顯示GDB說明,不管它:
上面最後一行“(gdb)”為GDB内部指令引導符,等待使用者輸入GDB指令。
下面使用“file”指令載入被調試程式 main(這裡的 main 即前面gcc 編譯輸出的可執行檔案):
如果最後一行提示Reading symbols from /home/minger/share/tencent/gdb/main…done. 表示已經加載成功。
下面使用“r”指令執行(Run)被調試檔案,因為尚未設定任何斷點,将直接執行到程式結束:
假設有以下程式,啟動時需要帶參數:
#include
編譯:
gcc
這種情況如何啟動調試呢?隻需要r的時候帶上參數即可。
Core Dump:Core的意思是記憶體,Dump的意思是扔出來,堆出來(段錯誤)。開發和使用Unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示(有時候會提示core dumped),這時候可以檢視一下有沒有形如core.程序号的檔案生成,這個檔案便是作業系統把程式down掉時的記憶體内容扔出來生成的, 它可以做為調試程式的參考,能夠很大程式幫助我們定位問題。那怎麼生成Core檔案呢?
生成Core方法産生coredump的條件,首先需要确認目前會話的ulimit –c,若為0,則不會産生對應的coredump,需要進行修改和設定。
即便程式core dump了也不會有core檔案留下。我們需要讓core檔案能夠産生,設定core大小為無限:
ulimit
因為core dump預設會生成在程式的工作目錄,但是有些程式存在切換目錄的情況,導緻core dump生成的路徑沒有規律,
是以最好是自己建立一個檔案夾,存放生成的core檔案。
我建立一個 /data/coredump 檔案夾,在根目錄data裡的coredump檔案夾。
調用如下指令:
echo
将更改core檔案生成路徑,自動放在這個/data/coredump檔案夾裡。
%e表示程式名, %p表示程序id
測試代碼:
/*
編譯運作:
運作後結果顯示段錯誤,該程式在主函數内部scanf的時候回崩潰,i前面應該加上&。
這個時候,進入/data/coredump檔案夾可以檢視生成的core
然後用gdb調試該core,指令為 gdb core.test.3591 ,顯示如下
program terminated with signal 11 告訴我們信号中斷了我們的程式,發生了段錯誤。
這個時候可以敲指令 backtrace(bt) 檢視函數的調用的棧幀和層級關系。
這個一堆問号很多人遇到過,網上有些人說是沒加載符号表,有人說是标準glibc版本不一緻,不糾結這個問題。
可以通過如下指令調試:
gdb
gdb 可執行程式
進入gdb環境後,core-file core的名字
敲bt指令,這是gdb檢視back trace的指令,檢視函數的調用的棧幀和層級關系。
可以看到最近的棧中存儲的是調用了IO操作,可以看到main函數的26行出錯。
到此為止,就是core檔案配置生成和調試方法。
總結至此,我們GDB啟動調試方式完畢,和core檔案配置生成和調試方法。後續接着講斷點設定、單步調試等。本人能力有限,歡迎留言補充。
歡迎關注微信公衆号“
程式猿編碼” ,這裡Linux c/c++ 、Python、Go語言、資料結構與算法、網絡程式設計相關知識,常用的程式員工具。每日00:10之前更新新聞簡報,一份簡報,縱覽天下事!