GDB調試精粹

一、列文件清單

list / l

列出產生執行文件的源代碼的一部分

<span style="font-size:14px;">//列出 line1 到 line2 行之間的源代碼
(gdb) list line1, line2

//輸出從上次調用list命令開始往後的10行程序代碼
(gdb) list

//輸出第 n 行附近的10行程序代碼
(gdb) list n

//輸出函數function前後的10行程序代碼
(gdb) list function</span>

二、執行程序

run / r

運行準備調試的程序,在它後面可以跟隨發給該程序的任何參數,包括標準輸入和標準輸出說明符(<和>)和shell通配符(*、?、[、])在內。

如果你使用不帶參數的run命令,gdb就再次使用你給予前一條run命令的參數,這是很有用的。

set args

命令就可以修改發送給程序的參數,而使用

show args

命令就可以查看其缺省參數的列表。

<span style="font-size:14px;">(gdb) set args –b –x
(gdb) show args</span>

三、顯示數據

print / p

查看變量的值

<span style="font-size:14px;">//利用print 命令可以檢查各個變量的值。
(gdb) print p (p爲變量名)
</span>

print 是 gdb 的一個功能很強的命令,利用它可以顯示被調試的語言中任何有效的表達式。表達式除了包含你程序中的變量外,還可以包含以下內容:

<span style="font-size:14px;">//對程序中函數的調用
(gdb) print find_entry(1, 0)

//數據結構和其他複雜對象
(gdb) print *table_start
$8={e=reference=’\000’,location=0x0,next=0x0}

//值的歷史成分
(gdb)print $1 ($1爲歷史記錄變量,在以後可以直接引用 $1 的值)</span>

whatis

查看變量的類型

<span style="font-size:14px;">//whatis 命令可以顯示某個變量的類型
(gdb) whatis p
type = int *</span>

四、設置與清除斷點

break / b

可以用來在調試的程序中設置斷點,該命令有如下四種形式

<span style="font-size:14px;">//使程序恰好在執行給定行之前停止
break line-number

//使程序恰好在進入指定的函數之前停止

break function-name

//如果condition(條件)是真,程序到達指定行或函數時停止
break line-or-function if condition
 
//在指定例程的入口處設置斷點
break routine-name</span>

如果該程序是由很多原文件構成的,你可以在各個原文件中設置斷點,而不是在當前的原文件中設置斷點,其方法如下:

<span style="font-size:14px;">(gdb) break filename:line-number

(gdb) break filename:function-name</span>

break  if
要想設置一個條件斷點,可以利用break if命令,如下所示:

<span style="font-size:14px;">(gdb) break line-or-function if expr

(gdb) break 46 if testsize==100
</span>

clean number

清除原文件中某一代碼行上的所有斷點

注:number 爲原文件的某個代碼行的行號

五、斷點的管理

1. 顯示當前gdb的斷點信息

info break

2. delete 刪除指定的某個斷點

delete breakpoint

<span style="font-size:14px;">//該命令將會刪除編號爲1的斷點
(gdb) delete breakpoint 1

//如果不帶編號參數,將刪除所有的斷點
(gdb) delete breakpoint</span>

3. 禁止、允許使用某個斷點

disable breakpoint 1

enable breakpoint 1

該命令將禁止、允許斷點 1,同時斷點信息的 (Enb)域將變爲 n、y

六、單步執行

next / n

不進入的單步執行

step

進入的單步執行

finish

如果已經進入了某函數,而想退出該函數返回到它的調用函數中,可使用命令finish

until

結束當前循環

七、函數的調用

call name

調用和執行一個函數

<span style="font-size:14px;">(gdb) call gen_and_sork( 1234,1,0 )
(gdb) call printf(“abcd”)
$1=4
</span>

finish 結束執行當前函數,顯示其返回值(如果有的話)

八、 原文件的搜索

search text

該命令可顯示在當前文件中包含text串的下一行。

reverse-search text

該命令可以顯示包含text 的前一行。

小結:常用的 gdb 命令

backtrace / bt 顯示程序中的當前位置和表示如何到達當前位置的棧跟蹤(同義詞:where)

breakpoint / b 在程序中設置一個斷點

cd 改變當前工作目錄

clear 刪除剛纔停止處的斷點

commands 命中斷點時,列出將要執行的命令

continue 從斷點開始繼續執行

delete 刪除一個斷點或監測點;也可與其他命令一起使用

display 程序停止時顯示變量和表達時

down 下移棧幀,使得另一個函數成爲當前函數

frame 選擇下一條continue命令的幀

info 顯示與該程序有關的各種信息

jump 在源程序中的另一點開始運行

kill 異常終止在gdb 控制下運行的程序

list 列出相應於正在執行的程序的原文件內容

next 執行下一個源程序行,從而執行其整體中的一個函數

print 顯示變量或表達式的值

pwd 顯示當前工作目錄

ptype 顯示一個數據結構(如一個結構或C++類)的內容

quit 退出gdb

reverse-search 在源文件中反向搜索正規表達式

run 執行該程序

search 在源文件中搜索正規表達式

set variable 給變量賦值

signal 將一個信號發送到正在運行的進程

step 執行下一個源程序行,必要時進入下一個函數

undisplay display 命令的反命令,不要顯示錶達式

until 結束當前循環

up 上移棧幀,使另一函數成爲當前函數

watch 在程序中設置一個監測點(即數據斷點)

whatis 顯示變量或函數類型


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章