GDB之顯示陣列

2021-06-28 01:08:39 字數 3268 閱讀 5581

gdb之顯示陣列資訊

本文將介紹如何使用gdb來顯示陣列的資訊。

為了顯示結構體陣列的資訊,我們定義了結構體foo:

typedef struct foo

foo;

同時為了更美觀的顯示結構體資訊,這裡預設執行了以下命令:

(gdb) set print pretty on          # 以縮排格式顯示結構體,且每個元素佔一行

(1)靜態陣列

直接使用「

p 陣列名

即可顯示靜態陣列資訊。

假設我們定義了2個靜態陣列:

int static_array[5] = ;

foo static_fooarray[3] = , , };

使用gdb列印的結果如下:

(gdb) p static_array

$1 =

(gdb) p static_fooarray

$23 = , , }

(2)動態陣列

可以使用操作符「

@」來顯示乙個陣列。位於@左邊的運算元是所要顯示的陣列的第乙個元素,並且必須是乙個單獨的物件(而不是指標)。

位於@右邊的運算元是所要顯示的陣列的長度,即陣列元素的個數。

假設我們定義了2個動態陣列:

int *dynamic_array = (int *) malloc(5*sizeof(int));

for(i = 0; i < 5; i++)

// 為了讓大家直觀地看到每個元素的值,這裡使用直接賦值的方式,而不是迴圈語句。

foo *dynamic_fooarray = (foo *)malloc(3*sizeof(foo));

dynamic_fooarray->a = 'x';

dynamic_fooarray->b = 10;

dynamic_fooarray->c = 11;

(dynamic_fooarray+1)->a = 'y';

(dynamic_fooarray+1)->b = 12;

(dynamic_fooarray+1)->c = 13;

(dynamic_fooarray+2)->a = 'z';

(dynamic_fooarray+2)->b = 14;

(dynamic_fooarray+2)->c = 15;

使用gdb列印的結果如下:

(gdb) p dynamic_array			# 列印動態陣列的陣列名,得到的是指標的值,即指標儲存的記憶體位址。

$2 = (int *) 0x602010

(gdb) p *dynamic_array@5 # 從dynamic_array開始,列印5個與*dynamic_array相同型別(這裡為int)的陣列元素

$3 =

(gdb) p *dynamic_fooarray@3 # 從dynamic_fooarray開始,列印3個與*dynamic_fooarray相同型別(這裡為foo)的陣列元素

$4 = , , }

(3)列印結構體陣列中的某個成員的值

結構體可能包含了很多成員,但我們只關心其中的乙個或幾個成員。此時我們可以通過以下方式來只顯示某個成員的值。

假設我們要顯示陣列dynamic_fooarray的成員a的資訊。

(gdb) set $i=0                          # 設定convenience variable

(gdb) p dynamic_fooarray[$i++]->a # 顯示dynamic_fooarray->a的值,並將$i的值加1

$12 = 120 'x'

(gdb) # 直接敲回車鍵。等同於執行前一條命令p dynamic_fooarray[$i++]->a,即顯示(dynamic_fooarray+1)->a的值,並將$i的值加1

$13 = 121 'y'

(gdb) # 直接敲回車鍵。等同於執行前一條命令p dynamic_fooarray[$i++]->a,即顯示(dynamic_fooarray+2)->a的值,並將$i的值加1

$14 = 122 'z'

這種方法有個缺陷,不小心回車鍵按多了,會導致讀取陣列越界的值。

gdb還支援if/else/while/loop_break/loop_continue,我們可以通過使用迴圈語句來顯示陣列資訊。

同樣是顯示陣列dynamic_fooarray的成員a的資訊,這裡我們使用迴圈語句來實現。

(gdb) set $i=0                          # 設定convenience variable

(gdb) while($i<3)

> p dynamic_fooarray[$i++]->a

> end

$1 = 120 'x'

$2 = 121 'y'

$3 = 122 'z'

(4)還有一種方式,使用x或p命令直接讀取陣列所在記憶體的值。但此時要考慮位元組序和位元組對齊等問題,且不夠直觀,這裡就不做描述了。

【參考資料】

[1]      《debugging with gdb, tenth edition》

10.4節、

10.11節和

23.1.3節

gdb顯示變數 和 陣列

程式變數 檢視檔案中某變數的值 file variable function variable 可以通過這種形式指定你所想檢視的變數,是哪個檔案中的或是哪個函式中的。例如,檢視檔案f2.c中的全域性變數x的值 gdb p f2.c x 檢視陣列的值 有時候,你需要檢視一段連續的記憶體空間的值。比如陣...

gdb 設定顯示選項

linux環境下c程式設計指南 第二版 p95 設定顯示選項 1,開啟位址輸出,當程式顯示函式資訊時,gdb會顯示函式的引數位址,該選項預設是開啟的 set print address set print address on 當使用f或者frame檢視函式資訊,如下 檢視當前函式的引數位址顯示選項...

GDB除錯 陣列檢視技巧

gdb是在linux上開發的必備除錯工具,也是乙個強大的除錯工具,在檢視陣列的值時,可以檢視陣列中的多個值。如 我定義的乙個陣列變數如下 char monophonestrs 如果用gdb檢視,如下 gdb p monolookup monophonestrs 8 0x627ec0 aa gdb 這...