在學會了使用 gdb 啟動除錯和設定除錯斷點後,為了驗證程式的執行結果是否符合預期,經常需要檢視和驗證一些關鍵變數的值。
gdb下可以使用print
、display
、coammand
、info
等命令檢視變數。
為了便於理解,本文所有內容使用下面的簡單 demo 進行舉例說明。
#include
#include
int main(int argc,char *ar**)
;char *char_array = null;
char_array = (char*)malloc(257);
if(null == char_array)for(int i = 0; i < 256; ++i)
char_array[256] = '\0';delete
char_array;return 0;
}
一、檢視普通變數基本型別變數、陣列、字串等可以使用print
命令 (縮寫形式p
) 快速檢視其在當前上下文中的值。
在本文所用 demo 下,p int_val
可檢視整型變數 int_val 在記憶體中的值。
可以在變數名前面加上檔名或函式名限定變數的範圍。
例如,p 'main'::int_val
表示檢視 main 函式中的整型變數 int_val 的值。
當要檢視的字串內容較長時,預設情況下使用print
命令檢視時只會顯示前面的 200 個字元,剩下的字元會用 … 表示。
可以在 gdb 下使用set print elements 0
設定顯示字串內容時不限制長度。當然,也可以通過set print elements 250
來設定最長顯示 250 個字元。
如果想一次性檢視陣列中多個元素的值,可以在資料名後加 @ 並跟上期望檢視的元素個數。例如,p *int_array@3
可檢視陣列 int_array 的前3個元素。
此外,還可以自定義 linux 環境變數形式 ($ 形式) 的下標變數檢視指定陣列中指定位置的元素。
下圖展示了一種快速檢視int_array陣列中最後4個元素的方法。
二、指定變數輸出格式
print
命令預設情況下會根據變數的型別對應的格式列印變數值。如果需要更加靈活的變數列印格式控制,則需要使用格式控制符 (模擬 c 語言中的printf函式)。
常用的格式控制符包括:
例如,d
: 按十進位制格式列印變數
x
: 按十六進製制格式列印變數
t
: 按二進位制格式列印變數
o
: 按八進位制格式列印變數
f
: 按浮點數格式列印變數
c
: 按字元格式列印變數
p/x int_val
可以以十六進製制的形式列印整型變數 int_val 的值。但是,使用p/t float_val
以二進位制形式列印浮點型變數 float_val 時,會因為被轉換為整型而出錯 (二進位制 1001 表示9)。這時候,需要用到另外乙個檢視變數的命令examine
。
examine
命令 (縮寫形式x
) 可以檢視變數在對應記憶體位址中的值,其命令格式為:x/[n][f][u] addr
。
其中,可選引數n
表示要列印的記憶體單元個數,預設值為1;f
表示上面介紹的各種格式控制符;u
表示要列印的記憶體單元長度;addr
表示變數的記憶體位址 (注意:不能是變數名)。
常用的記憶體單元包括:b
(單位元組)、h
(雙位元組)、w
(四位元組)、g
(八字節)。
如果需要以單位元組為單位,以二進位制的方式列印浮點變數 float_val,可以使用 gdb 命令x/4tb &float_val
;同樣地,x/10dw int_array
可以四位元組的方法列印以int_array位址開始的連續10個記憶體單元的值 (這正好是整型陣列int_array10個元素的值)。
三、其他檢視變數的方法
除了常用的print
和examine
命令外,display
命令可以用於當程式被 gdb 暫停時自動列印某變數的值。
info registers
命令可以檢視除浮點暫存器外的所有暫存器值。
擴充套件閱讀
1. gdb入門教程之如何使用gdb啟動除錯
2. gdb入門教程之暫停程式
gdb列印字串長度設定
在使用gdb除錯過程中,經常需要檢視變數的值,最常用的方法 gdb print 一般情況下,列印並不存在問題。但當乙個字串比較長時,列印出來的內容不完整,內容的最後為 例如 gdb p char 0x23b744a98 19 0x23b744a98 obbs s 1.3 ok.這次列印已經能顯示整個...
gdb 除錯列印完整字串
在使用gdb除錯過程中,經常需要檢視變數的值,最常用的方法 gdb print 一般情況下,列印並不存在問題。但當乙個字串比較長時,列印出來的內容不完整,內容的最後為 例如 gdb p char 0x23b744a98 19 0x23b744a98 obbs s 1.3 ok.這次列印已經能顯示整個...
gdb 除錯列印完整字串
gdb show print elements limit on string chars or array elements to print is200 可以看到預設只會列印200個字元。這個可以通過前面的舉例驗證。使列印的字串長度不受限制。gdb setprint elements 0 gdb...