gdb是gnu開源組織發布的乙個強大的linux下的程式除錯工具。一般來說,gdb主要幫助你完成下面四個方面的功能:
1、啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。
2、可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)
3、當程式被停住時,可以檢查此時你的程式中所發生的事。
4、你可以改變你的程式,將乙個bug產生的影響修正從而測試其他bug。
一、普通命令
(gdb)help:檢視命令幫助,具體命令查詢在gdb中輸入help + 命令,簡寫h
(gdb)start:單步執行,執行程式,停在第一執行語句。
(gdb)list:檢視原**(list-n,從第n行開始檢視**。list+ 函式名:檢視具體函式),簡寫l
(gdb)set:設定變數的值
(gdb)next:單步除錯(逐過程,函式直接執行),簡寫n
(gdb)step:單步除錯(逐語句:跳入自定義函式內部執行),簡寫s
(gdb)backtrace:檢視函式的呼叫的棧幀和層級關係,簡寫bt
(gdb)bt full:不僅顯示backtrace,還顯示區域性變數。
(gdb)frame:切換函式的棧幀,簡寫f
(gdb)info:檢視函式內部區域性變數的數值,簡寫i
(gdb)finish:結束當前函式,返回到函式呼叫點
(gdb)continue:繼續執行,簡寫c
(gdb)
p *array@len :
顯示陣列,
p相當於print,array就是陣列首位址,也可以是陣列名,len是想要顯示的陣列的長度。
(gdb)quit:退出gdb,簡寫q
(gdb)break+num:在第num行設定斷點,簡寫b
(gdb) break 9 if sum != 0 :滿足條件才啟用斷點
(gdb)info breakpoints:檢視當前設定的所有斷點
(gdb)delete breakpoints num:刪除第num個斷點,簡寫d
(gdb)display:追蹤檢視具體變數值
(gdb)undisplay:取消追蹤觀察變數
(gdb)watch:被設定觀察點的變數發生修改時,列印顯示。比如:
watch input[4]
(gdb)i watch:顯示觀察點
(gdb)enable breakpoints:啟用斷點
(gdb)disable breakpoints:禁用斷點
(gdb)
x/:檢視記憶體,
n、f、u是可選的引數。
x/3uh 0x54320 表示,從記憶體位址0x54320讀取內容,h表示以雙位元組為乙個單位,3表示輸出三個單位,u表示按十六進製制顯示。)
(gdb)run ar**[1] ar**[2]:除錯時命令列傳參。
二、高階命令
1、除錯設定引數的方法,有兩種:
1)run 引數1 引數2 引數n
2)set args 引數1 引數2 引數n
可用 show args 檢視。
2、gdb除錯已在執行的程序
gdb -p 《程序號》
或者:gdb attach 《程序號》
1.1)通過命令:ps -aux | grep 程序名(比如:main) ,獲取執行main的程序(pid),比如獲取到pid:10001
1.2)啟動gdb attach,執行gdb attach pid即可除錯正在執行的程式,輸入命令:gdb attach 10001
1.3)設定
原始碼對映,
對原始碼路徑重新設定。
[可選]
set substitute-path /home/johnchen1/workspace/oldcode /home/
johnchen2
/other/newcode
原始碼路徑:
/home/johnchen1/workspace/oldcode
實際**路徑:
/home/
johnchen2
/other/newcode
用實際**替換原始碼,此過程需要包版本和**版本一致。
1.4)設定斷點
b ***.cpp:100
//除錯***.cpp檔案,斷點為100行。
1.5)已是執行中的程式不需要啟動(r),繼續(c)即可。
1.6)等待指令或報文觸發斷點,被擊中會停留在斷點行。
1.7)其他gdb操作(s單步除錯(逐語句:跳入自定義函式內部執行);n單步除錯(逐過程,函式直接執行);bt等)
參考:
3、使用gdb時對原始碼路徑重新設定
有的時候乙個程式不是在同乙個機器上執行的,當除錯的時候就可能無法找到源**的路徑,這時就需要使用下面的方法了:
當gdb程式找不到原始碼時,進行重新設定原始碼路徑步驟:
(1). 使用如下命令檢視目標檔案中儲存的是相對路徑還是絕對路徑
readelf -p .debug_str target_bin_file
(2). 如果是相對路徑:
使用 gdb 的dir命令新增的原始碼搜尋路徑
(3). 如果是絕對路徑:
進行路徑重新對映:set substitute-path old_path new_path
檢視當前環境設定的除錯目錄:show directories
4、examine
(gdb) x/
: 列印的數目,預設為1。
: 列印的格式1,預設為上次使用的:
o(octal): 8進製整數
x(hex): 16進製制整數
d(decimal): 10進製整數
u(unsigned decimal): 10進製非負整數
t(binary): 2進製整數
f(float): 浮點數
a(address): 輸出相對於前面最近的符號的偏移
i(instruction): 輸出位址處的彙編指令
c(char): 字元
s(string): c字串(null-terminated string)
z(hex, zero padded on the left): 見說明
: 列印的位元組數目,預設為上次使用的:
b(byte): 1個位元組
h(halfword): 2個位元組
w(word): 4個位元組
g(giant, 8 bytes): 8個位元組
: 目標位址
幾個例子:
(gdb) x/a 0x401419
0x401419 : 0x55c3c900000000b8
(gdb) x/i 0x40138d
=> 0x40138d : mov -0x10(%rbp),%eax
(gdb) x/1fg 140737488346064
0x7fffffffdbd0: 10.125
5、gdb堆疊跟蹤
程式「呼叫堆疊」是當前函式之前的所有已呼叫函式的列表(包括當前函式)。每個函式及其變數都被分配了乙個「幀」,
最近呼叫的函式在 0 號幀中(「底部」幀)。要列印堆疊,發出命令 'bt'('backtrace' [回溯] 的縮寫):
(gdb) bt
#0 0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1 0x8048435 in main (argc=1, ar**=0xbffff9c4) at eg1.c:21
此結果顯示了在 main() 的第 21 行中呼叫了函式 wib()(只要使用 'list 21' 就能證實這一點),而且 wib() 在 0 號幀中,
main() 在 1 號幀中。由於 wib() 在 0 號幀中,那麼它就是執行程式時發生算術錯誤的函式。
實際上,發出 'info locals' 命令時,gdb 會列印出當前幀中的區域性變數,預設情況下,這個幀中的函式就是被中斷的函式(0 號幀)。
可以使用命令 'frame' 列印當前幀。要檢視 main 函式(在 1 號幀中)中的變數,可以發出 'frame 1' 切換到 1 號幀,
然後發出 'info locals' 命令:
(gdb) frame 1
#1 0x8048435 in main (argc=1, ar**=0xbffff9c4) at eg1.c:21
21 result = wib(value, div);
(gdb) info locals
value = 8
div = 8
result = 4
i = 2
total = 6
此資訊顯示了在第三次執行 "for" 迴圈時(i 等於 2)發生了錯誤,此時 "value" 等於 "div"。
可以通過如上所示在 'frame' 命令中明確指定號碼,或者使用 'up' 命令在堆疊中上移以及 'down' 命令在堆疊中下移來切換幀。
要獲取有關幀的進一步資訊,如它的位址和程式語言,可以使用命令 'info frame'。
6、執行緒相關的命令
一些除錯多執行緒程式時常用的命令:
info threads: 檢視執行緒列表
thread 2: 切換到2號執行緒,執行緒編號可由info threads得知
7、使用linux的gdb列印stl(vector,map,set等)
Linux下gdb相關使用方法
目錄 一 進入除錯的方式 二 單執行緒下的gdb 三 多執行緒下的gdb 注1 gdb除錯值core檔案臨時生成,首先使用ulimit c檢視core檔案大小設定,並可用該命令更改大小設定,當為ulimit c unlimited時,core檔案大小沒有限制 注2 設定永久生成core檔案 修改檔案...
gdb使用方法
一 程式例子 test.c include int fun int n return sum int main printf d n sum int ret 0 ret fun sum printf d n ret return 0 二 編譯 g表示開啟除錯開關 sudo gcc g test.c ...
gdb使用方法
教程見 編譯程式時需要加上 g,之後才能用gdb進行除錯 gcc g main.c o main gdb中命令 gdb tui a.out 除錯中顯示源 gdb help 檢視命令幫助,具體命令查詢在gdb中輸入help 命令,簡寫h gdb start 單步執行,執行程式,停在第一執行語句 gdb...