GDB除錯基本命令 一

2021-09-30 08:20:02 字數 3354 閱讀 4108

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主要幫忙你完成...