一:列文件清單
1. List
(gdb) list line1,line2
二:執行程序
要想運行準備調試的程序,可以使用run命令,在它後面能夠跟隨發給該程序的任何參數,包括標準輸入和標準輸出說明符()和外殼通配符(*、?、[、])在內。
若是你使用不帶參數的run命令,gdb就再次使用你給予前一條run命令的參數,這是頗有用的。
利用set args 命令就能夠修改發送給程序的參數,而使用show args 命令就能夠查看其缺省參數的列表。
(gdb)set args –b –x
(gdb) show args
backtrace命令爲堆棧提供向後跟蹤功能。
Backtrace 命令產生一張列表,包含着從最近的過程開始的因此有效過程和調用這些過程的參數。
三:顯示數據
利用print 命令能夠檢查各個變量的值。
(gdb) print p (p爲變量名)
whatis 命令能夠顯示某個變量的類型
(gdb) whatis p
type = int *
print 是gdb的一個功能很強的命令,利用它能夠顯示被調試的語言中任何有效的表達式。表達式除了包含你程序中的變量外,還能夠包含如下內容:
l 對程序中函數的調用
(gdb) print find_entry(1,0)
l 數據結構和其餘複雜對象
(gdb) print *table_start
$8={e=reference=’\000’,location=0x0,next=0x0}
l 值的歷史成分
(gdb)print $1 ($1爲歷史記錄變量,在之後能夠直接引用 $1 的值)
l 人爲數組
人爲數組提供了一種去顯示存儲器塊(數組節或動態分配的存儲區)內容的方法。早期的調試程序沒有很好的方法將任意的指針換成一個數組。就像對待參數同樣,讓咱們查看內存中在變量h後面的10個整數,一個動態數組的語法以下所示:
base@length
所以,要想顯示在h後面的10個元素,可使用h@10:
(gdb)print h@10
$13=(-1,345,23,-234,0,0,0,98,345,10)
四:
斷點
(breakpoint)
break命令(能夠簡寫爲b)能夠用來在調試的程序中設置斷點,該命令有以下四種形式:
l break line-number 使程序剛好在執行給定行以前中止。
l break function-name 使程序剛好在進入指定的函數以前中止。
l break line-or-function if condition 若是condition(條件)是真,程序到達指定行或函數時中止。
l break routine-name 在指定例程的入口處設置斷點
若是該程序是由不少原文件構成的,你能夠在各個原文件中設置斷點,而不是在當前的原文件中設置斷點,其方法以下:
(gdb) break filename:line-number
(gdb) break filename:function-name
要想設置一個條件斷點,能夠利用break if命令,以下所示:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100
從斷點繼續運行:countinue 命令
五.斷點的管理
1. 顯示當前gdb的斷點信息:
(gdb) info break
他會以以下的形式顯示全部的斷點信息:
Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168
(gdb)
2.刪除指定的某個斷點:
(gdb) delete breakpoint 1
該命令將會刪除編號爲1的斷點,若是不帶編號參數,將刪除全部的斷點
(gdb) delete breakpoint
3.禁止使用某個斷點
(gdb) disable breakpoint 1
該命令將禁止斷點 1,同時斷點信息的 (Enb)域將變爲 n
4.容許使用某個斷點
(gdb) enable breakpoint 1
該命令將容許斷點 1,同時斷點信息的 (Enb)域將變爲 y
5.清除原文件中某一代碼行上的全部斷點
(gdb)clean number
注:number 爲原文件的某個代碼行的行號
六.變量的檢查和賦值
l whatis:識別數組或變量的類型
l ptype:比whatis的功能更強,他能夠提供一個結構的定義
l set variable:將值賦予變量
l print 除了顯示一個變量的值外,還能夠用來賦值
七.單步執行
l next
不進入的單步執行
l step
進入的單步執行
若是已經進入了某函數,而想退出該函數返回到它的調用函數中,可以使用命令finish
八.函數的調用
l call name 調用和執行一個函數
(gdb) call gen_and_sork( 1234,1,0 )
(gdb) call printf(「abcd」)
$1=4
l finish 結束執行當前函數,顯示其返回值(若是有的話)
九.機器語言工具
有一組專用的gdb變量能夠用來檢查和修改計算機的通用寄存器,gdb提供了目前每一臺計算機中實際使用的4個寄存器的標準名字:
l $pc : 程序計數器
l $fp : 幀指針(當前堆棧幀)
l $sp : 棧指針
l $ps : 處理器狀態
十.信號
gdb 一般能夠捕捉到發送給它的大多數信號,經過捕捉信號,它就可決定對於正在運行的進程要作些什麼工做。例如,按CTRL-C將中斷信號發送給gdb,一般就會終止gdb。可是你或許不想中斷gdb,真正的目的是要中斷gdb正在運行的程序,所以,gdb要抓住該信號並中止它正在運行的程序,這樣就能夠執行某些調試操做。
Handle命令可控制信號的處理,他有兩個參數,一個是信號名,另外一個是接受到信號時該做什麼。幾種可能的參數是:
l nostop 接收到信號時,不要將它發送給程序,也不要中止程序。
l stop 接受到信號時中止程序的執行,從而容許程序調試;顯示一條表示已接受到信號的消息(禁止使用消息除外)
l print 接受到信號時顯示一條消息
l noprint 接受到信號時不要顯示消息(並且隱含着不中止程序運行)
l pass 將信號發送給程序,從而容許你的程序去處理它、中止運行或採起別的動做。
l nopass 中止程序運行,但不要將信號發送給程序。
例如,假定你截獲SIGPIPE信號,以防止正在調試的程序接受到該信號,並且只要該信號一到達,就要求該程序中止,並通知你。要完成這一任務,可利用以下命令:
(gdb) handle SIGPIPE stop print
請注意,UNIX的信號名老是採用大寫字母!你能夠用信號編號替代信號名
若是你的程序要執行任何信號處理操做,就須要可以測試其信號處理程序,爲此,就須要一種能將信號發送給程序的簡便方法,這就是signal命令的任務。該命令的參數是一個數字或者一個名字,如SIGINT。假定你的程序已將一個專用的SIGINT(鍵盤輸入,或CTRL-C;信號2)信號處理程序設置成採起某個清理動做,要想測試該信號處理程序,你能夠設置一個斷點並使用以下命令:
(gdb) signal 2
continuing with signal SIGINT(2)
該程序繼續執行,可是當即傳輸該信號,並且處理程序開始運行.
十一. 原文件的搜索
search text:該命令可顯示在當前文件中包含text串的下一行。
Reverse-search text:該命令能夠顯示包含text 的前一行。
十二.UNIX接口
shell 命令可啓動UNIX外殼,CTRL-D退出外殼,返回到 gdb.
十三.命令的歷史
爲了容許使用歷史命令,可以使用 set history expansion on 命令
(gdb) set history expansion on
小結:經常使用的gdb命令
backtrace 顯示程序中的當前位置和表示如何到達當前位置的棧跟蹤(同義詞:where)
breakpoint 在程序中設置一個斷點
cd 改變當前工做目錄
clear 刪除剛纔中止處的斷點
commands 命中斷點時,列出將要執行的命令
continue 從斷點開始繼續執行
delete 刪除一個斷點或監測點;也可與其餘命令一塊兒使用
display 程序中止時顯示變量和表達時
down 下移棧幀,使得另外一個函數成爲當前函數
frame 選擇下一條continue命令的幀
info 顯示與該程序有關的各類信息
jump 在源程序中的另外一點開始運行
kill 異常終止在gdb 控制下運行的程序
list 列出相應於正在執行的程序的原文件內容
next 執行下一個源程序行,從而執行其總體中的一個函數
print 顯示變量或表達式的值
pwd 顯示當前工做目錄
pype 顯示一個數據結構(如一個結構或C++類)的內容
quit 退出gdb
reverse-search 在源文件中反向搜索正規表達式
run 執行該程序
search 在源文件中搜索正規表達式
set variable 給變量賦值
signal 將一個信號發送到正在運行的進程
step 執行下一個源程序行,必要時進入下一個函數
undisplay display命令的反命令,不要顯示錶達式
until 結束當前循環
up 上移棧幀,使另外一函數成爲當前函數
watch 在程序中設置一個監測點(即數據斷點)
whatis 顯示變量或函數類型
****************************************************
GNU的調試器稱爲gdb,該程序是一個交互式工具,工做在字符模式。在 X Window 系統中,有一個gdb的前端圖形工具,稱爲xxgdb。gdb 是功能強大的調試程序,可完成以下的調試任務:
* 設置斷點;
* 監視程序變量的值;
* 程序的單步執行;
* 修改變量的值。
在可使用 gdb 調試程序以前,必須使用 -g 選項編譯源文件。可在 makefile 中以下定義 CFLAGS 變量:
CFLAGS = -g
運行 gdb 調試程序時一般使用以下的命令:
gdb progname
在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有:
* aliases:命令別名
* breakpoints:斷點定義;
* data:數據查看;
* files:指定並查看文件;
* internals:維護命令;
* running:程序執行;
* stack:調用棧查看;
* statu:狀態查看;
* tracepoints:跟蹤程序執行。
鍵入 help 後跟命令的分類名,可得到該類命令的詳細清單。
gdb 的經常使用命令
命令 解釋
break NUM 在指定的行上設置斷點。
bt 顯示全部的調用棧幀。該命令可用來顯示函數的調用順序。
clear 刪除設置在特定源文件、特定行上的斷點。其用法爲clear FILENAME:NUM
continue 繼續執行正在調試的程序。該命令用在程序因爲處理信號或斷點而 致使中止運行時。
display EXPR 每次程序中止後顯示錶達式的值。表達式由程序定義的變量組成。
file FILE 裝載指定的可執行文件進行調試。
help NAME 顯示指定命令的幫助信息。
info break 顯示當前斷點清單,包括到達斷點處的次數等。
info files 顯示被調試文件的詳細信息。
info func 顯示全部的函數名稱。
info local 顯示當函數中的局部變量信息。
info prog 顯示被調試程序的執行狀態。
info var 顯示全部的全局和靜態變量名稱。
kill 終止正被調試的程序。
list 顯示源代碼段。
make 在不退出 gdb 的狀況下運行 make 工具。
next 在不單步執行進入其餘函數的狀況下,向前執行一行源代碼。
print EXPR 顯示錶達式 EXPR 的值。
前端