C gdb除錯工具

2021-08-29 05:13:26 字數 3820 閱讀 6707

編譯程式

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

=值的歷史成分

(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」)

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

九.機器語言工具

有一組專用的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)

該程式繼續執行,但是立即傳輸該訊號,而且處理程式開始執行。

cgdb遠端除錯

嵌入式系統中使用cgdb進行除錯 cgdb depends on libreadline and ncurses development libraries.configure prefix usr local cgdb make sudo make install ln s usr local c...

除錯工具 之Python除錯工具pycharm

1 pycharm的安裝 pycharm是一款非常好用的python ide,提供專業版和社群版,就像eclipse和myeclipse一樣,專業版是收費的,而社群版是免費的但功能就沒有專業版的功能強大。1.2 安裝 這裡就不必細說,直接next就ok ps 安裝完成後一定要執行 1.3 破解 採用...

gflags除錯工具

gflags windows除錯工具。使用它幫助我解決了瞎調了一整天的記憶體問題。由於使用了已經delete的指標,vs提示位置又錯誤的情況下,瞎調了一通。怎麼想那塊也不會有問題,可是抱著對vs的信任把錯就歸咎於自己吧!偶然的機會,搜到了gflags,抱著試一試的心態,使用該工具 1.安裝 debu...