国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Gdb調(diào)試精粹及使用實(shí)例

 

一:列文件清單
1. List
(gdb) list line1,line2

二:執(zhí)行程序
要想運(yùn)行準(zhǔn)備調(diào)試的程序,可使用run命令,在它后面可以跟隨發(fā)給該程序的任何參數(shù),包括標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出說明符(<和>)和外殼通配符(*、?、[、])在內(nèi)。
如果你使用不帶參數(shù)的run命令,gdb就再次使用你給予前一條run命令的參數(shù),這是很有用的。
利用set args 命令就可以修改發(fā)送給程序的參數(shù),而使用show args 命令就可以查看其缺省參數(shù)的列表。
gdb)set args –b –x
(gdb) show args
backtrace命令為堆棧提供向后跟蹤功能。
Backtrace 命令產(chǎn)生一張列表,包含著從最近的過程開始的所以有效過程和調(diào)用這些過程的參數(shù)。

三:顯示數(shù)據(jù)
利用print 命令可以檢查各個(gè)變量的值。
(gdb) print p (p為變量名)
whatis 命令可以顯示某個(gè)變量的類型
(gdb) whatis p
type = int *

print 是gdb的一個(gè)功能很強(qiáng)的命令,利用它可以顯示被調(diào)試的語言中任何有效的表達(dá)式。表達(dá)式除了包含你程序中的變量外,還可以包含以下內(nèi)容:
l 對(duì)程序中函數(shù)的調(diào)用
(gdb) print find_entry(1,0)
l 數(shù)據(jù)結(jié)構(gòu)和其他復(fù)雜對(duì)象
(gdb) print *table_start
$8={e=reference=’\000’<repeats 79 times>,location=0x0,next=0x0}
l 值的歷史成分
(gdb)print $1 ($1為歷史記錄變量,在以后可以直接引用 $1 的值)
l 人為數(shù)組
人為數(shù)組提供了一種去顯示存儲(chǔ)器塊(數(shù)組節(jié)或動(dòng)態(tài)分配的存儲(chǔ)區(qū))內(nèi)容的方法。早期的調(diào)試程序沒有很好的方法將任意的指針換成一個(gè)數(shù)組。就像對(duì)待參數(shù)一樣,讓我們查看內(nèi)存中在變量h后面的10個(gè)整數(shù),一個(gè)動(dòng)態(tài)數(shù)組的語法如下所示:
base@length
因此,要想顯示在h后面的10個(gè)元素,可以使用h@10:
(gdb)print h@10
$13=(-1,345,23,-234,0,0,0,98,345,10)

四:斷點(diǎn)(breakpoint)
break命令(可以簡(jiǎn)寫為b)可以用來在調(diào)試的程序中設(shè)置斷點(diǎn),該命令有如下四種形式:
l break line-number 使程序恰好在執(zhí)行給定行之前停止。
l break function-name 使程序恰好在進(jìn)入指定的函數(shù)之前停止。
l break line-or-function if condition 如果condition(條件)是真,程序到達(dá)指定行或函數(shù)時(shí)停止。
l break routine-name 在指定例程的入口處設(shè)置斷點(diǎn)

如果該程序是由很多原文件構(gòu)成的,你可以在各個(gè)原文件中設(shè)置斷點(diǎn),而不是在當(dāng)前的原文件中設(shè)置斷點(diǎn),其方法如下:
(gdb) break filename:line-number
(gdb) break filename:function-name

要想設(shè)置一個(gè)條件斷點(diǎn),可以利用break if命令,如下所示:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100

從斷點(diǎn)繼續(xù)運(yùn)行:countinue 命令
五.?dāng)帱c(diǎn)的管理

1. 顯示當(dāng)前gdb的斷點(diǎn)信息:
(gdb) info break
他會(huì)以如下的形式顯示所有的斷點(diǎn)信息:
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.刪除指定的某個(gè)斷點(diǎn):
(gdb) delete breakpoint 1
該命令將會(huì)刪除編號(hào)為1的斷點(diǎn),如果不帶編號(hào)參數(shù),將刪除所有的斷點(diǎn)
(gdb) delete breakpoint
3.禁止使用某個(gè)斷點(diǎn)
(gdb) disable breakpoint 1
該命令將禁止斷點(diǎn) 1,同時(shí)斷點(diǎn)信息的 (Enb)域?qū)⒆優(yōu)?n
4.允許使用某個(gè)斷點(diǎn)
(gdb) enable breakpoint 1
該命令將允許斷點(diǎn) 1,同時(shí)斷點(diǎn)信息的 (Enb)域?qū)⒆優(yōu)?y
5.清除原文件中某一代碼行上的所有斷點(diǎn)
(gdb)clean number
注:number 為原文件的某個(gè)代碼行的行號(hào)
六.變量的檢查和賦值
l whatis:識(shí)別數(shù)組或變量的類型
l ptype:比whatis的功能更強(qiáng),他可以提供一個(gè)結(jié)構(gòu)的定義
l set variable:將值賦予變量
l print 除了顯示一個(gè)變量的值外,還可以用來賦值

七.單步執(zhí)行
l next
不進(jìn)入的單步執(zhí)行
l step
進(jìn)入的單步執(zhí)行
如果已經(jīng)進(jìn)入了某函數(shù),而想退出該函數(shù)返回到它的調(diào)用函數(shù)中,可使用命令finish
八.函數(shù)的調(diào)用
l call name 調(diào)用和執(zhí)行一個(gè)函數(shù)
(gdb) call gen_and_sork( 1234,1,0 )
(gdb) call printf(“abcd”)
$1=4
l finish 結(jié)束執(zhí)行當(dāng)前函數(shù),顯示其返回值(如果有的話)

九.機(jī)器語言工具
有一組專用的gdb變量可以用來檢查和修改計(jì)算機(jī)的通用寄存器,gdb提供了目前每一臺(tái)計(jì)算機(jī)中實(shí)際使用的4個(gè)寄存器的標(biāo)準(zhǔn)名字:
l $pc : 程序計(jì)數(shù)器
l $fp : 幀指針(當(dāng)前堆棧幀)
l $sp : 棧指針
l $ps : 處理器狀態(tài)

十.信號(hào)
gdb通??梢圆蹲降桨l(fā)送給它的大多數(shù)信號(hào),通過捕捉信號(hào),它就可決定對(duì)于正在運(yùn)行的進(jìn)程要做些什么工作。例如,按CTRL-C將中斷信號(hào)發(fā)送給gdb,通常就會(huì)終止gdb。但是你或許不想中斷gdb,真正的目的是要中斷gdb正在運(yùn)行的程序,因此,gdb要抓住該信號(hào)并停止它正在運(yùn)行的程序,這樣就可以執(zhí)行某些調(diào)試操作。

Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:
l nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。
l stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)
l print 接受到信號(hào)時(shí)顯示一條消息
l noprint 接受到信號(hào)時(shí)不要顯示消息(而且隱含著不停止程序運(yùn)行)
l pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。
l nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。
例如,假定你截獲SIGPIPE信號(hào),以防止正在調(diào)試的程序接受到該信號(hào),而且只要該信號(hào)一到達(dá),就要求該程序停止,并通知你。要完成這一任務(wù),可利用如下命令:
(gdb) handle SIGPIPE stop print
請(qǐng)注意,UNIX的信號(hào)名總是采用大寫字母!你可以用信號(hào)編號(hào)替代信號(hào)名
如果你的程序要執(zhí)行任何信號(hào)處理操作,就需要能夠測(cè)試其信號(hào)處理程序,為此,就需要一種能將信號(hào)發(fā)送給程序的簡(jiǎn)便方法,這就是signal命令的任務(wù)。該 命令的參數(shù)是一個(gè)數(shù)字或者一個(gè)名字,如SIGINT。假定你的程序已將一個(gè)專用的SIGINT(鍵盤輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采 取某個(gè)清理動(dòng)作,要想測(cè)試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:
gdb) signal 2
continuing with signal SIGINT(2)
該程序繼續(xù)執(zhí)行,但是立即傳輸該信號(hào),而且處理程序開始運(yùn)行.

十一. 原文件的搜索
search text:該命令可顯示在當(dāng)前文件中包含text串的下一行。
Reverse-search text:該命令可以顯示包含text 的前一行。

十二.UNIX接口
shell 命令可啟動(dòng)UNIX外殼,CTRL-D退出外殼,返回到 gdb.

十三.命令的歷史
為了允許使用歷史命令,可使用 set history expansion on 命令
(gdb) set history expansion on

小結(jié):常用的gdb命令
backtrace 顯示程序中的當(dāng)前位置和表示如何到達(dá)當(dāng)前位置的棧跟蹤(同義詞:where)
breakpoint 在程序中設(shè)置一個(gè)斷點(diǎn)
cd 改變當(dāng)前工作目錄
clear 刪除剛才停止處的斷點(diǎn)
commands 命中斷點(diǎn)時(shí),列出將要執(zhí)行的命令
continue 從斷點(diǎn)開始繼續(xù)執(zhí)行
delete 刪除一個(gè)斷點(diǎn)或監(jiān)測(cè)點(diǎn);也可與其他命令一起使用
display 程序停止時(shí)顯示變量和表達(dá)時(shí)
down 下移棧幀,使得另一個(gè)函數(shù)成為當(dāng)前函數(shù)
frame 選擇下一條continue命令的幀
info 顯示與該程序有關(guān)的各種信息
jump 在源程序中的另一點(diǎn)開始運(yùn)行
kill 異常終止在gdb 控制下運(yùn)行的程序
list 列出相應(yīng)于正在執(zhí)行的程序的原文件內(nèi)容
next 執(zhí)行下一個(gè)源程序行,從而執(zhí)行其整體中的一個(gè)函數(shù)
print 顯示變量或表達(dá)式的值
pwd 顯示當(dāng)前工作目錄
pype 顯示一個(gè)數(shù)據(jù)結(jié)構(gòu)(如一個(gè)結(jié)構(gòu)或C++類)的內(nèi)容
quit 退出gdb
reverse-search 在源文件中反向搜索正規(guī)表達(dá)式
run 執(zhí)行該程序
search 在源文件中搜索正規(guī)表達(dá)式
set variable 給變量賦值
signal 將一個(gè)信號(hào)發(fā)送到正在運(yùn)行的進(jìn)程
step 執(zhí)行下一個(gè)源程序行,必要時(shí)進(jìn)入下一個(gè)函數(shù)
undisplay display命令的反命令,不要顯示表達(dá)式
until 結(jié)束當(dāng)前循環(huán)
up 上移棧幀,使另一函數(shù)成為當(dāng)前函數(shù)
watch 在程序中設(shè)置一個(gè)監(jiān)測(cè)點(diǎn)(即數(shù)據(jù)斷點(diǎn))
whatis 顯示變量或函數(shù)類型
****************************************************
 GNU的調(diào)試器稱為gdb,該程序是一個(gè)交互式工具,工作在字符模式。在 X Window 系統(tǒng)中,有一個(gè)gdb的前端圖形工具,稱為xxgdb。gdb 是功能強(qiáng)大的調(diào)試程序,可完成如下的調(diào)試任務(wù): 
  * 設(shè)置斷點(diǎn); 
  * 監(jiān)視程序變量的值; 
  * 程序的單步執(zhí)行; 
  * 修改變量的值。 
  在可以使用 gdb 調(diào)試程序之前,必須使用 -g 選項(xiàng)編譯源文件??稍?nbsp;makefile 中如下定義 CFLAGS 變量: 
   CFLAGS = -g 
   運(yùn)行 gdb 調(diào)試程序時(shí)通常使用如下的命令: 
   gdb progname 

  在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有: 
  * aliases:命令別名 
  * breakpoints:斷點(diǎn)定義; 
  * data:數(shù)據(jù)查看; 
  * files:指定并查看文件; 
  * internals:維護(hù)命令; 
  * running:程序執(zhí)行; 
  * stack:調(diào)用棧查看; 
  * statu:狀態(tài)查看; 
  * tracepoints:跟蹤程序執(zhí)行。 
  鍵入 help 后跟命令的分類名,可獲得該類命令的詳細(xì)清單。 


gdb 的常用命令 
命令 解釋 
  break NUM 在指定的行上設(shè)置斷點(diǎn)。 
  bt 顯示所有的調(diào)用棧幀。該命令可用來顯示函數(shù)的調(diào)用順序。 
  clear 刪除設(shè)置在特定源文件、特定行上的斷點(diǎn)。其用法為clear FILENAME:NUM 
  continue 繼續(xù)執(zhí)行正在調(diào)試的程序。該命令用在程序由于處理信號(hào)或斷點(diǎn)而 導(dǎo)致停止運(yùn)行時(shí)。 
  display EXPR 每次程序停止后顯示表達(dá)式的值。表達(dá)式由程序定義的變量組成。 
  file FILE 裝載指定的可執(zhí)行文件進(jìn)行調(diào)試。 
  help NAME 顯示指定命令的幫助信息。 
  info break 顯示當(dāng)前斷點(diǎn)清單,包括到達(dá)斷點(diǎn)處的次數(shù)等。 
  info files 顯示被調(diào)試文件的詳細(xì)信息。 
  info func 顯示所有的函數(shù)名稱。 
  info local 顯示當(dāng)函數(shù)中的局部變量信息。 
  info prog 顯示被調(diào)試程序的執(zhí)行狀態(tài)。 
  info var 顯示所有的全局和靜態(tài)變量名稱。 
  kill 終止正被調(diào)試的程序。 
  list 顯示源代碼段。 
  make 在不退出 gdb 的情況下運(yùn)行 make 工具。 
  next 在不單步執(zhí)行進(jìn)入其他函數(shù)的情況下,向前執(zhí)行一行源代碼。 
  print EXPR 顯示表達(dá)式 EXPR 的值。 

******gdb 使用范例************************ 
----------------- 
清單 一個(gè)有錯(cuò)誤的 C 源程序 bugging.c 
代碼: 

----------------- 
1 #include <unistd.h> 

3 static char buff [256]; 
4 static char* string; 
5 int main () 
6 { 
7   printf ("Please input a string: "); 
8   gets (string);   
9   printf ("\nYour string is: %s\n", string); 
10 } 
 

----------------- 
  上面這個(gè)程序非常簡(jiǎn)單,其目的是接受用戶的輸入,然后將用戶的輸入打印出來。該程序使用了一個(gè)未經(jīng)過初始化的字符串地址  string,因此,編譯并運(yùn)行之后,將出現(xiàn) Segment Fault 錯(cuò)誤: 
$ gcc -o bugging -g bugging.c 
$ ./bugging 
Please input a string: asfd 
Segmentation fault (core dumped) 
為了查找該程序中出現(xiàn)的問題,我們利用 gdb,并按如下的步驟進(jìn)行: 
1.運(yùn)行 gdb bugging 命令,裝入 bugging 可執(zhí)行文件; 
2.執(zhí)行裝入的 bugging 命令 run; 
3.使用 where 命令查看程序出錯(cuò)的地方; 
4.利用 list 命令查看調(diào)用 gets 函數(shù)附近的代碼; 
5.唯一能夠?qū)е?nbsp;gets 函數(shù)出錯(cuò)的因素就是變量 string。用print命令查看 string 的值; 
6.在 gdb 中,我們可以直接修改變量的值,只要將 string 取一個(gè)合法的指針值就可以了,為此,我們?cè)诘?行處設(shè)置斷點(diǎn) break 8; 
7.程序重新運(yùn)行到第 8行處停止,這時(shí),我們可以用 set variable 命令修改 string 的取值; 
8.然后繼續(xù)運(yùn)行,將看到正確的程序運(yùn)行結(jié)果。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
[轉(zhuǎn)]用GDB調(diào)試程序
用GDB調(diào)試程序
比較全面的gdb調(diào)試命令
GDB調(diào)試手冊(cè)
gdb常用命令 — Windows Live
GDB的使用方法 - 羅索工作室
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服