gdb 列印字串長度 GDB入門教程之檢視變數

2021-10-14 06:30:10 字數 3117 閱讀 7474

在學會了使用 gdb 啟動除錯和設定除錯斷點後,為了驗證程式的執行結果是否符合預期,經常需要檢視和驗證一些關鍵變數的值。

gdb下可以使用printdisplaycoammandinfo等命令檢視變數。

為了便於理解,本文所有內容使用下面的簡單 demo 進行舉例說明。

#include#includeint 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';deletechar_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個元素的值)。

三、其他檢視變數的方法

除了常用的printexamine命令外,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...