天天看點

gdb調試

目錄

linux gdb調試

一丶gdb

1.1 簡介

二丶指令介紹

2.1 gdb調試程式

2.1.1 gdb調試

2.1.2 gdb啟動時候的參數

2.1.3 gdb的基本指令

2.1.4 gdb中的斷點調試

2.1.5 資料操作指令

2.1.6 調試運作環境相關指令

2.1.7 堆棧相關指令

2.1.8 跳轉執行指令

​ gdb是一個在unix(linux)環境下的指令行調試工具。如果調試c/c++程式可以在gcc/g++

編譯生成的時候加上-g選項。

參考資料來自于: vim+gdb 某部落格作者

gdb調試一個程式有多種方法

首先可以使用指令生成調試檔案。然後看下表所示來進行調試。

指令:

gdb指令表

指令

說明

gdb

指定你要調試的程式的檔案名直接開始調試

gdb core

用gdb同時調試一個運作程式和一個core檔案。core檔案就是程式非法執行後的coredump後産生的檔案。記錄了程式在出錯的時候的一些記憶體環境和出錯資訊。 可以了解為windows平台上的dump檔案

如果你的程式是一個服務程式,那麼可以制定這個服務程式運作時的程序id. gdb則會自動attach上去,并且調試他。 program應能在環境變量path中搜尋得到。

​ gdb指令在啟動的時候可以附加一些參數,這些參數也稱為gdb的啟動開關。

如果想看詳細的開關可以用gdb-help檢視。

下面列舉一下常見的參數

參數

作用

-symbols or -s

一個是全名稱,一個是縮寫。 代表的意思是從指定檔案中讀取符号表.

-se file

從指定檔案中讀取符号表資訊,并把它用在可執行檔案中。

-core -c

調試core dump的core檔案

-directory or -d

加入一個源檔案的搜尋路徑。預設搜尋路徑是path環境中所能搜尋到的路徑。

提示:

​ gdb支援全名和縮寫。是以在使用的時候任選其一即可。

直接做成表

l

不是一 也不是 ai(i) 是l ,作用是檢視源碼,源碼會進行行号提示。如果要檢視的函數是其他檔案中定義的函數,那麼在l後面加上函數名即可定位到這個函數的定義,以及檢視附近的其他源碼,或者使用斷點 或者單步執行,到了某個函數處使用s進入這個函數也可以。

b

b指令設定斷點: b 6 在源碼的第六行下斷點。 這個行号是gdb的行号

info b

info b 可以檢視斷點清單。

r

運作代碼

p

p是列印變量名,但是你需要在程式暫停的時候使用。例如有個n變量。 可以 p n 來檢視n的值。 gdb在顯示變量值的時候都會在對應值前面加上$n标記,它是目前變量值的引用标記,當你想再次使用的時候可以直接寫作 “$n”,而無需寫冗長的變量名。

watch

watch檢視某一個變量的變化情況,一般用于循環的時候使用。 watch n

n

單步執行

c

程式繼續運作,直到遇到斷點或者程式結束。

q

退出gdb

指令格式

例子

break + 設定斷點的行号

break n

在n行處設定斷點

tbreak + 行号或函數名

tbreak n/func

設定臨時斷點,到達後被自動删除

break + filename + 行号

break main.c:10

用于在指定檔案對應行設定斷點

break + <0x...>

break 0x3400a

用于在記憶體某一位置處暫停

break + 行号 + if + 條件

break 10 if i==3

用于設定條件斷點,在循環中使用非常友善

info breakpoints/watchpoints [n]

info break

n表示斷點号,檢視斷點/觀察點的情況

clear + 要清除的斷點行号

clear 10

用于清除對應行的斷點,要給出斷點的行号,清除時gdb會給出提示

delete + 要清除的斷點編号

delete 3

用于清除斷點和自動顯示的表達式的指令,要給出斷點的編号,清除時gdb不會給出任何提示

disable/enable + 斷點編号

disable 3

讓所設斷點暫時失效/使能,如果要讓多個編号處的斷點失效/使能,可将編号之間用空格隔開

awatch/watch + 變量

awatch/watch i

設定一個觀察點,當變量被讀出或寫入時程式被暫停

rwatch + 變量

rwatch i

設定一個觀察點,當變量被讀出時,程式被暫停

catch

設定捕捉點來補捉程式運作時的一些事件。如:載入共享庫(動态連結庫)或是c++的異常

tcatch

隻設定一次捕捉點,當程式停住以後,應點被自動删除

display +表達式

display a

用于顯示表達式的值,每當程式運作到斷點處都會顯示表達式的值

info display

用于顯示目前所有要顯示值的表達式的情況

delete + display 編号

用于删除一個要顯示值的表達式,被删除的表達式将不被顯示

disable/enable + display 編号

disable/enable 3

使一個要顯示值的表達式暫時失效/使能

undisplay + display 編号

undisplay 3

用于結束某個表達式值的顯示

whatis + 變量

whatis i

顯示某個表達式的資料類型

print(p) + 變量/表達式

p n

用于列印變量或表達式的值

set + 變量 = 變量值

set i = 3

改變程式中某個變量的值

補充:

在使用print指令時,可以對變量按指定格式進行輸出,其指令格式為print /變量名 + 格式

  其中常用的變量格式:x:十六進制;d:十進制;u:無符号數;o:八進制;c:字元格式;f:浮點數。

set args

set args arg1 arg2

設定運作參數

show args

檢視運作參數

set width + 數目

set width 70

設定gdb的行寬

cd + 工作目錄

cd ../

切換工作目錄

run

r/run

程式開始執行

step(s)

s

進入式(會進入到所調用的子函數中)單步執行,進入函數的前提是,此函數被編譯有debug資訊

next(n)

非進入式(不會進入到所調用的子函數中)單步執行

finish

一直運作到函數傳回并列印函數傳回時的堆棧位址和傳回值及參數值等資訊

until + 行數

u 3

運作到函數某一行

continue(c)

執行到下一個斷點或程式結束

return <傳回值>

return 5

改變程式流程,直接結束目前函數,并将指定值傳回

call + 函數

call func

在目前位置執行所要運作的函數

更多操作指令格式

backtrace/bt

bt

用來列印棧幀指針,也可以在該指令後加上要列印的棧幀指針的個數,檢視程式執行到此時,是經過哪些函數呼叫的程式,程式“調用堆棧”是目前函數之前的所有已調用函數的清單(包括目前函數)。每個函數及其變量都被配置設定了一個“幀”,最近調用的函數在 0 号幀中(“底部”幀)

frame

frame 1

用于列印指定棧幀

info reg

檢視寄存器使用情況

info stack

檢視堆棧使用情況

up/down

跳到上一層/下一層函數

跳轉執行指令就一個jump 此指令可以指定下一條語句的運作點。也可以是檔案的行号。

也可以是 file:line 格式。 也可以是+offset偏移的格式。 如果在arm彙編中其實就是修改了pc寄存器的指向值。 如果在inter x86平台中就是修改了ip的指向(eip/rip)