本文是我在學習linux gdb偵錯程式的時候所做的筆記,主要記錄在使用gdb的時候常用的命令,以便於以後的複習參考,不正確的地方忘高手指教 。
gdb是gnu開源組織發布的乙個強大的unix下的程式偵錯程式,gdb主要可幫助工程師完成下面4個方面的功能
在除錯核心金額除錯應用程式時使用gdb命令是完全相同的
1、list命令
在gdb中執行list命令(縮寫l)可以列出**,list具體形式如下:
2、run命令
在gdb中,執行程式使用run命令。在程式執行前,我麼可以設定如下4方面的工作環境
3、break命令
在gdb中使用break命令來設定斷點,設定斷點方法如下
4、單步命令
在除錯過程中,next命令用於單步執行,類似於vc++中的step over。next的單步不會進入函式的內部,與next對應的step(縮寫為s)命令則在單步執行乙個函式時,進入其內部,類似於vc++中的step into。單步執行的更複雜用法如下
ignore-count 表示忽略其後多少次斷點。
6、print命令
在除錯程式時,當程式被停住時,可以使用print命令(縮寫為p),或是同義命令inspect來檢視當前執行資料。print命令格式如下:
是表示式,也是被除錯的程式中的表示式,是輸出的格式,比如,如果要把表示式按十六進製制的格式輸出,那麼就是/x。在表示式中,有幾種gdb所支援的操作符,他們可以用在任何一種語言中,@是乙個和陣列有關係的操作符,::指定乙個在檔案或是函式中的變數,{}表示乙個指向記憶體位址的型別為type的物件。
int *array = (int*)malloc (len *sizeof(int));
在gdb除錯過程中這樣顯示這個動態陣列的值
print的輸出格式如下:
x按照十六進製制格式顯示變數
d按照十進位制格式顯示變數
u按照十六進製制格式顯示無符號整型
o按照八進位制格式顯示變數
t按照二進位制格式顯示變數
a按照十六機制格式顯示變數
c按照字元格式顯示變數
f按照浮點格式顯示變數
我們可以使用display命令設定,當程式停住時,或是單步追蹤時,這些變數會自動顯示。
如果要修改變數,如x的值,可使用如下命令
當用gdb的print檢視程式執行資料時,每乙個print都會被gdb記錄下來。gdb會以$1,$2,$3......這樣的方式為每乙個print命令編號。我們可以使用這個編號訪問以前的表示式,如$1
7、watch命令
watch一般用來觀察某個表示式(變數也是一種表示式)的值是否有了變化,如果有變化,馬上停止程式的執行。我們有如下幾種方法來設定觀察點。
8、examine命令
表示乙個記憶體位址。「x/」後的n、f、u都是可選的引數,n是乙個正整數,表示顯示記憶體的長度,也就是從當前位址向後顯示的哥位址的內容;f表示顯示的格式,如果位址所指的是字串,那麼格式可以是s,如果位址是指令位址,那麼格式可以是i;u表示從當前位址往後請求的位元組數,如果不指定的話,gdb預設的是4個位元組。u引數可以被一些字元代替:b表示單位元組,h表示雙位元組,w表示4位元組,g表示8位元組。當我們指定了位元組的長度後,gdb會從指定的記憶體位址開始,讀寫指定位元組,並把其當作乙個值取出來。n、f、u這3個引數可以一起使用,例如命令 x/3uh 0x54320 表示從記憶體位址0x54320 開始以雙位元組為1個單位(h)、16進製制方式(u)顯示3個單位(3)的記憶體
9、set命令
examine命令用於查詢記憶體,而set命令用於設定記憶體。它的命令格式是「set *有型別的指標=value」 比如:
對如下函式進行記憶體位址設定,並檢視
10、jump命令
一般來說,被除錯程式會按照程式**的執行順序依次執行,但是gdb也提供了亂序執行的功能,也就是說,gdb可以修改程式的執行順序從而讓程式隨意跳躍。這個功能可以由jump命令jump來指定下一條語句的執行點。可以是檔案的行號,可以是file:line的格式,也可以是+num這種偏移量格式,表示下一條執行語句從那裡開始。
注意:jump指令不會改變當前程式棧中的內容,如果使用jump從乙個函式跳轉到另乙個函式,當跳轉到的函式執行完返回,進行出棧操作時不然會發生錯誤,這可能會導致意想不到的錯誤,因此最好只用jump在同乙個函式中進行跳轉
11、signal命令
使用signal命令,可以產生乙個訊號量給被除錯的程式,如中斷訊號ctrl+c。於是,可以在程式執行的任意位置處設定斷點,並在該斷點處用gdb產生乙個訊號量,這種精確的在某處產生訊號的方法非常有利於程式的除錯的。signal命令的語法是signal,unix的系統訊號量通常為1~15,因此的取值也在這個範圍內
12、return命令
如果在函式中設定了除錯斷點,在斷點後還有語句沒有執行完,這時候我們可以使用return命令強制函式忽略還沒有執行的語句並返回
上述return命令用於取消當前函式的執行,並立即返回,如果指定了,那麼該表示式的值會被作為函式的返回值
13、call命令
call命令強制呼叫某函式
call
表示式可以是函式,以此達到強制呼叫函式的目的,他會顯示函式的返回值(如果函式的返回值不是void)。比如下列程式執行while(1)的時候:
#include #include int main(int argc, char*ar**)
我們強制要求其執行strcpy()和printf(),執行效果如下:
14、info命令可以用來在除錯時檢視暫存器、斷點、觀察點和訊號資訊。要檢視暫存器的值,可以使用如下命令:
檢視斷點資訊,使用如下命令
列出當前所設定的所有觀察點,可使用如下命令
要檢視那些訊號正在被gdb檢測使用如下命令
15、disassemble命令
disassemble命令用於反彙編,可用它來檢視當前執行時的源**的機器碼,實際上只是把目前記憶體中的指令沖刷出來。
註明:本部落格是根據宋寶華的l《linux裝置驅動 開發詳解》所編寫
GDB偵錯程式
偵錯程式gdb 一 啟動和退出gdb gdb除錯的物件是可執行檔案,而不是程式的源 如果要使乙個可執行檔案可以被gdb除錯,那麼在使用編譯器gcc編譯程式時需要加入 g選項。gdb除錯乙個程式的命令格式是 gdb 程式檔名 也可以在linux提示符下,直接輸入gdb,然後使用file命令裝入要除錯的...
gdb偵錯程式
在使用gdb偵錯程式之前,必須在編譯程式時加上 g選項 功能 顯示上次內容之前或之後的10行內容,首次使用顯示main 函式之前或之後的10行內容 命令 list 簡稱 l 功能 顯示引數行之前和之後的10行內容.命令 list line number 簡稱 l 10 功能 顯示原始檔從一行到另一行...
gdb偵錯程式
gdb是gnu發布的一款強大的除錯功能 gdb主要完成下面三個方面的功能 1 啟動被除錯程式 2 讓被除錯的程式在指定的位置停住 3 當程式停住時,可以檢視程式的狀態 變數值 gcc g test.c o test 生成除錯資訊 gdb test 啟動gdb gdb除錯工具相關命令 gdb run ...