linux下GDB的使用方法

2021-10-06 21:20:59 字數 4658 閱讀 4403

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...