GDB 使用 (七)改變程式的執行

2021-05-01 01:18:55 字數 1869 閱讀 5153

改變程式的執行

一旦使用gdb掛上被除錯程式,當程式執行起來後,你可以根據自己的除錯思路來動態地在gdb中更改當前被除錯程式的執行線路或是其變數的值,這個強大的功能能夠讓你更好的除錯你的程式,比如,你可以在程式的一次執行中走遍程式的所有分支。

一、修改變數值

修改被除錯程式執行時的變數值,在gdb中很容易實現,使用gdb的print命令即可完成。如:

(gdb) print x=4

x=4這個表示式是c/c++的語法,意為把變數x的值修改為4,如果你當前除錯的語言是pascal,那麼你可以使用pascal的語法:x:=4。

在某些時候,很有可能你的變數和gdb中的引數衝突,如:

(gdb) whatis width

type = double

(gdb) p width

$4 = 13

(gdb) set width=47

invalid syntax in expression.

因為,set width是gdb的命令,所以,出現了「invalid syntax in expression」的設定錯誤,此時,你可以使用set var命令來告訴gdb,width不是你gdb的引數,而是程式的變數名,如:

(gdb) set var width=47另外,還可能有些情況,gdb並不報告這種錯誤,所以保險起見,在你改變程式變數取值時,最好都使用set var格式的gdb命令。

二、跳轉執行

一般來說,被除錯程式會按照程式**的執行順序依次執行。gdb提供了亂序執行的功能,也就是說,gdb可以修改程式的執行順序,可以讓程式執行隨意跳躍。這個功能可以由gdb的jump命令來完:

jump

指定下一條語句的執行點。可以是檔案的行號,可以是file:line格式,可以是+num這種偏移量格式。表式著下一條執行語句從**開始。

jump

這裡的是**行的記憶體位址。注意,jump命令不會改變當前的程式棧中的內容,所以,當你從乙個函式跳到另乙個函式時,當函式執行完返回時進行彈棧操作時必然會發生錯誤,可能結果還是非常奇怪的,甚至於產生程式core dump。所以最好是同乙個函式中進行跳轉。

set $pc = 0x485

三、產生訊號量

使用singal命令,可以產生乙個訊號量給被除錯的程式。如:中斷訊號ctrl+c。這非常方便於程式的除錯,可以在程式執行的任意位置設定斷點,並在該斷點用gdb產生乙個訊號量,這種精確地在某處產生訊號非常有利程式的除錯。

語法是:signal ,unix的系統訊號量通常從1到15。所以取值也在這個範圍。single命令和shell的kill命令不同,系統的kill命令發訊號給被除錯程式時,是由gdb截獲的,而single命令所發出一訊號則是直接發給被除錯程式的。

四、強制函式返回

如果你的除錯斷點在某個函式中,並還有語句沒有執行完。你可以使用return命令強制函式忽略還沒有執行的語句並返回。

return

return

使用return命令取消當前函式的執行,並立即返回,如果指定了,那麼該表示式的值會被認作函式的返回值。

五、強制呼叫函式

call

表示式中可以一是函式,以此達到強制呼叫函式的目的。並顯示函式的返回值,如果函式返回值是void,那麼就不顯示。

另乙個相似的命令也可以完成這一功能——print,print後面可以跟表示式,所以也可以用他來呼叫函式,print和call的不同是,如果函式返回void,call則不顯示,print則顯示函式返回值,並把該值存入歷史資料中。

GDB改變程式的執行

1 修改變數值 set var var name num 最佳 print var name num 2 跳轉執行 gdb提供了亂序執行的功能。jump linespec linespec可以是檔案的行號,也可以是 num這偏移的形式。jump addr jump不會改變當前程式棧中的內容,所以,當...

GDB除錯之改變程式執行流程

最近學習了函式呼叫及返回的流程後,突發奇想能不能直接使用gdb修改棧空間,達到呼叫函式 返回主函式 變為呼叫函式 插入自定義函式 返回主函式的效果,感覺很有意思,遂進行以下實驗 肥腸簡單的 如下 int add2 int a,int b int add int a,int b int main in...

使用gdb除錯當前執行的程式

用gdb可以除錯當前的程式的使用情況,讀出他的引數。以下用乙個簡單的程式做為例子 來說明gdb的除錯。第一步 編譯乙個死迴圈程式。file name malloc.c include include include void getmem void p,int num void test void ...