C gdb调试工具
編譯程序
cc -g try.c -o try
一 列文件清單
List
(gdb) list line1,line2
[編輯本段]
二:執行程序
要想運行準備調試的程序,可使用run命令,在它后面可以跟隨發給該程序的任何參數,包括標準輸入和標準輸出說明符(<和> )和shell通配符(*、?、[、])在內。如果你使用不帶參數的run命令,gdb就再次使用你給予前一條run命令的參數,這是很有用的。利用set args 命令就可以修改發送給程序的參數,而使用show args 命令就可以查看其缺省參數的列表。
(gdb)set args –b –x
(gdb) show args
backtrace命令為堆棧提供向后跟蹤功能。
Backtrace 命令產生一張列表,包含著從最近的過程開始的所有有效過程和調用這些過程的參數。
三:顯示數據
利用print 命令可以檢查各個變量的值。
(gdb) print p (p為變量名)
print 是gdb的一個功能很強的命令,利用它可以顯示被調試的語言中任何有效的表達式。表達式除了包含你程序中的變量外,還可以包含以下內容:
對程序中函數的調用
(gdb) print find_entry(1,0)
數據結構和其他復雜對象
(gdb) print *table_start
={e=reference=’\000’,location=0x0,next=0x0}
值的歷史成分
(gdb)print (為歷史記錄變量,在以后可以直接引用的值)
人為數組
人為數組提供了一種去顯示存儲器塊(數組節或動態分配的存儲區)內容的方法。早期的調試程序沒有很好的方法將任意的指針換成一個數組。就像對待參數一樣,讓我們查看內存中在變量h后面的10個整數,一個動態數組的語法如下所示:
base@length
因此,要想顯示在h后面的10個元素,可以使用h@10:
(gdb)print h@10
=(-1,345,23,-234,0,0,0,98,345,10)
whatis 命令可以顯示某個變量的類型
(gdb) whatis p
type = int *
四:斷點(breakpoint)
break命令(可以簡寫為b)可以用來在調試的程序中設置斷點,該命令有如下四種形式:
break line-number 使程序恰好在執行給定行之前停止。
break function-name 使程序恰好在進入指定的函數之前停止。
break line-or-function if condition 如果condition(條件)是真,程序到達指定行或函數時停止。
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) delete breakpoint 1
該命令將會刪除編號為1的斷點,如果不帶編號參數,將刪除所有的斷點
(gdb) delete breakpoint
禁止使用某個斷點
(gdb) disable breakpoint 1
該命令將禁止斷點 1,同時斷點信息的 (Enb)域將變為 n
允許使用某個斷點
(gdb) enable breakpoint 1
該命令將允許斷點 1,同時斷點信息的 (Enb)域將變為 y
清除原文件中某一代碼行上的所有斷點
(gdb)clean number
注:number 為原文件的某個代碼行的行號
六.變量的檢查和賦值
whatis:識別數組或變量的類型
ptype:比whatis的功能更強,他可以提供一個結構的定義
set variable:將值賦予變量
print 除了顯示一個變量的值外,還可以用來賦值
七. 單步執行
next 不進入的單步執行
step 進入的單步執行如果已經進入了某函數,而想退出該函數返回到它的調用函數中,可使用命令finish
八.函數的調用
call name 調用和執行一個函數
(gdb) call gen_and_sork( 1234,1,0 )
(gdb) call printf(“abcd”)
=4
finish 結束執行當前函數,顯示其返回值(如果有的話)
九.機器語言工具
有一組專用的gdb變量可以用來檢查和修改計算機的通用寄存器,gdb提供了目前每一臺計算機中實際使用的4個寄存器的標準名字:
$pc : 程序計數器
$fp : 幀指針(當前堆棧幀)
$sp : 棧指針
$ps : 處理器狀態
十.信號
gdb通常可以捕捉到發送給它的大多數信號,通過捕捉信號,它就可決定對于正在運行的進程要做些什么工作。例如,按CTRL-C將中斷信號發送給gdb,通常就會終止gdb。但是你或許不想中斷gdb,真正的目的是要中斷gdb正在運行的程序,因此,gdb要抓住該信號并停止它正在運行的程序,這樣就可以執行某些調試操作。
Handle命令可控制信號的處理,他有兩個參數,一個是信號名,另一個是接受到信號時該作什么。幾種可能的參數是:
nostop 接收到信號時,不要將它發送給程序,也不要停止程序。
stop 接受到信號時停止程序的執行,從而允許程序調試;顯示一條表示已接受到信號的消息(禁止使用消息除外)
print 接受到信號時顯示一條消息
noprint 接受到信號時不要顯示消息(而且隱含著不停止程序運行)
pass 將信號發送給程序,從而允許你的程序去處理它、停止運行或采取別的動作。
nopass 停止程序運行,但不要將信號發送給程序。
例如,假定你截獲SIGPIPE信號,以防止正在調試的程序接受到該信號,而且只要該信號一到達,就要求該程序停止,并通知你。要完成這一任務,可利用如下命令:
(gdb) handle SIGPIPE stop print
請注意,UNIX的信號名總是采用大寫字母!你可以用信號編號替代信號名如果你的程序要執行任何信號處理操作,就需要能夠測試其信號處理程序,為此,就需要一種能將信號發送給程序的簡便方法,這就是signal命令的任務。該命令的參數是一個數字或者一個名字,如SIGINT。假定你的程序已將一個專用的SIGINT(鍵盤輸入,或CTRL-C;信號2)信號處理程序設置成采取某個清理動作,要想測試該信號處理程序,你可以設置一個斷點并使用如下命令:
(gdb) signal 2
continuing with signal SIGINT(2)
該程序繼續執行,但是立即傳輸該信號,而且處理程序開始運行。
總結
- 上一篇: POJ 1836 Alignment
- 下一篇: 制作uefi的kali安装盘_制作 UD