工作和面試中的gdb


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容器數據。

 


金句分享

有很多好書對我的行為和信念產生了巨大影響。我嘗試着每天花一些時間去讀一本書或者聽一本有聲書,這些書會以某種方式改善我的生活。

出自《軟技能 代碼之外的生存指南》,“我的私房成功書單”章節。

 

解讀:讀書是對自己最好的投資,多讀一些專業書、理財書、勵志書。

 


免責聲明!

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



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