gdb是C/C++程序員必備的專業技能,工作中gdb最常用的場景有兩個,一個是分析core文件,另一個是調試程序。
分析core文件的方法如下:
1、gdb 程序名 core文件名
2、bt或where命令查看堆棧信息。
3、進入某個棧:f N,f是frame的縮寫,N是棧號,如0、1、2、3...
進入到某個棧后,才能通過p命令查看這個棧的臨時變量,否則只能查看全局變量。
例如a.out程序core產生了core文件core-a.out-12345,gdb方法如下:
gdb a.out core-a.out-12345
bt(或者where)
f 3,進入第3幀
調試一個正在運行的程序使用gdb -p PID命令,PID即程序的pid。
需要注意的是,gdb調試正在運行的程序會導致程序掛起,因此請記住不要gdb調試正在運行的在線服務。
設置斷點的方式有很多種,最常見的有兩種:一是設置程序運行到源代碼的某一行,二是設置程序運行到某個函數。
設置程序運行到某一行,通過“文件名:行號”的形式:
b test.cpp:100
設置程序運行到某個函數,通過“名字空間::函數名”的形式:
gdb namespace_a::func
查看斷點:info b
刪除斷點:d N,d是delete的縮寫,N是斷點的編號,可以通過info b查看。
無論哪種方式設置斷點,都要執行c命令(continue),讓程序繼續運行。
在調試程序時,最常用的gdb命令是:n、s、p
n即next,單步執行,執行下一步的意思,遇到函數會調用函數。
s即step,也是單步執行,但是會進入函數內部,然后結合n命令來調試函數。
p即print,打印變量,最常用的命令。p可以打印普通變量、std::string字符串、指針、數組等。
gdb打印字符串支持c_str()、length()等:
std::string str;
p str,p str.c_str()查看字符串內容,p str.length(),查看字符串長度
有時會遇到字符串太長不能顯示全,最后顯示"...",可以通過命令取消長度限制:
set print elements 0
這樣就能打印完整的字符串。
小提示:
1、gdb會自動保存上一次執行的命令,可以通過鍵盤的上下方向箭頭切換最近輸入的命令。
2、直接敲回車,會執行上一次的命令,在n單步調試的時候最常用。
面試中的gdb問題往往會很挑剔,除了考察常用的gdb命令,還會問一些多線程相關的命令,
例如怎么查看線程信息?怎么打印所有線程的當前棧信息?
gdb查看線程信息:info thread,可以查看線程編號和正在執行的函數
進入某個線程:t N,N是線程編號,如1、2、3...
查看所有線程的棧信息:thread apply all bt
這是面試官在考察面試者有沒有多線程問題排查經驗。
最后說一下gdb中如何打印STL的vector和map,gdb默認不支持STL,
需要從網上下載一個txt文件,然后將其內容追加到.gdbinit文件中,就可以使用pvector命令查看vector容器數據。
金句分享
有很多好書對我的行為和信念產生了巨大影響。我嘗試着每天花一些時間去讀一本書或者聽一本有聲書,這些書會以某種方式改善我的生活。
出自《軟技能 代碼之外的生存指南》,“我的私房成功書單”章節。
解讀:讀書是對自己最好的投資,多讀一些專業書、理財書、勵志書。