linux 包含了乙個叫 gdb 的 gnu 除錯程式,gdb 是乙個用來除錯 c 和 c++ 程式的強力偵錯程式,它使你能在程式執行時觀察程式的內部結構和記憶體的使用情況。在linux下開發應該掌握基本的命令,編譯時要加上-g選項。
一:列檔案清單
1.list
(gdb) list line number
(gdb) list - (向前翻)
(gdb) list + (向後翻)
二:執行程式
要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(《和》)和外殼萬用字元(*、?、[、])在內。
如果你使用不帶引數的run命令,gdb就再次使用你給予前一條run命令的引數,這是很有用的。
set args命令就可以修改傳送給程式的引數
show args命令就可以檢視其預設引數的列表。
(gdb) show args
backtrace命令為堆疊提供向後跟蹤功能。
backtrace 命令產生一張列表,包含著從最近的過程開始的所以有效過程和呼叫這些過程的引數。
三:顯示資料
利用print 命令可以檢查各個變數的值。
(gdb)printp (p為變數名)
whatis 命令可以顯示某個變數的型別
(gdb)whatisp
type = int *
print 是gdb的乙個功能很強的命令,利用它可以顯示被除錯的語言中任何有效的表示式。表示式除了包含你程式中的變數外,還可以包含以下內容:
對程式中函式的呼叫
(gdb) print find_entry(1,0)
資料結構和其他複雜物件
(gdb) print *table_start
$8=
值的歷史成分
(gdb)print $1 ($1為歷史記錄變數,在以後可以直接引用 $1 的值)
人為陣列
人為陣列提供了一種去顯示儲存器塊(陣列節或動態分配的儲存區)內容的方法。早期的除錯程式沒有很好的方法將任意的指標換成乙個陣列。就像對待引數一樣,讓我們檢視記憶體中在變數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)可以用來在除錯的程式中設定斷點,該命令有如下四種形式:
break file-number使程式恰好在執行給定檔案特定行之前停止
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)
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
六.變數的檢查和賦值
whatis:識別陣列或變數的型別
ptype:比whatis的功能更強,他可以提供乙個結構的定義
set variable:將值賦予變數
print 除了顯示乙個變數的值外,還可以用來賦值
七.單步執行
next不進入的單步執行
step進入的單步執行
如果已經進入了某函式,而想退出該函式返回到它的呼叫函式中,可使用命令finish,要想推出乙個迴圈用until。
八.函式的呼叫
call name 呼叫和執行乙個函式
(gdb) call gen_and_sork( 1234,1,0 )
(gdb) call printf(「abcd」)
$1=4
finish 結束執行當前函式,顯示其返回值(如果有的話)
gdb除錯基本命令
gdb是乙個由gnu開源組織發布的 unix linux作業系統下的 基於命令列的 功能強大的程式除錯工具。對於一名linux下工作的c 程式設計師,gdb是必不可少的工具 對c c 程式的除錯,需要在編譯前就加上 g選項 g g hello.cpp o hello 除錯可執行檔案 gdb prog...
GDB除錯基本命令
一 列檔案清單 list l 列出產生執行檔案的源 的一部分 列出 line1 到 line2 行之間的源 gdb list line1,line2 輸出從上次呼叫list命令開始往後的10行程式 gdb list 輸出第 n 行附近的10行程式 gdb list n 輸出函式function前後的...
GDB除錯基本命令
gdb是乙個強大的命令列除錯工具。大家知道命令列的強大就是在於,其可以形成執行序列,形成指令碼。unix下的軟體全是命令列的,這給程式開發提代供了極大的便利,命令列軟體的優勢在於,它們可以非常容易的整合在一起,使用幾個簡單的已有工具的命令,就可以做出乙個非常強大的功能。一般來說,gdb主要幫忙你完成...