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 這...