[GDB] 在 gdb 裡顯示指標指向的陣列內容

[GDB] 在 gdb 裡顯示指標指向的陣列內容

今天在用 gdb debug 一個程式問題時,需要看某個陣列的內容~

當然平常如果陣列就是用類似 int array[] 的方式宣告的話,用 gdb 是可以直接看到值的~

舉例來說,下面這個簡單的測試程式:

#include <stdio.h>
#include <string>
int main()
{
const char* arrayMsg[] =
{
"message",
"hello world",
"welcome home",
"dear john",
"sincerely yours"
};
const char** pArrayMsg = arrayMsg;
for (size_t i = 0; i < sizeof(arrayMsg)/sizeof(arrayMsg[0]); i++)
{
printf("msg=%s\n", arrayMsg[i]);
}
return 0;
}

 

這程式裡有個 arrayMsg 是陣列型態,而有另外一個 pArrayMsg 是個指向這陣列的指標~

在 gdb 裡面,可以直接印出 arrayMsg 的內容:

(gdb) print arrayMsg
$1 = {0x400700 "message", 0x400708 "hello world", 0x400714 "welcome home", 0x400721 "dear john", 0x40072b "sincerely yours"}

 

但是如果我現在只拿得到指標 pArrayMsg,要印出它指向的陣列的內容的話,

光打名字是不行的:

(gdb) print pArrayMsg
$2 = (const char **) 0x7fffffffe040

 

不過可以一個個印出來看…但太累了:

(gdb) print *pArrayMsg
$3 = 0x400700 "message"
(gdb) print pArrayMsg[0]
$4 = 0x400700 "message"
(gdb) print pArrayMsg[1]
$5 = 0x400708 "hello world"

 

有沒有更好的方法呢?在 gdb: Artificial Arrays 裡找到了解答, 

原來可以用 *pArray@len 的語法來印出指標指向的陣列,但得先知道陣列有幾個元素~

假設我們從某個地方知道這個陣列有 5 個元素,就可以這麼下:

(gdb) print *pArrayMsg@5
$7 = {0x400700 "message", 0x400708 "hello world", 0x400714 "welcome home", 0x400721 "dear john", 0x40072b "sincerely yours"}

 

如果給了過大的長度值,gdb 還是會照樣把後面的部分當作陣列的一部分印出來,

不過自然就是錯誤的資料了,因此正確的陣列長度是很重要的:

(gdb) print *pArrayMsg@6
$8 = {0x400700 "message", 0x400708 "hello world", 0x400714 "welcome home", 0x400721 "dear john", 0x40072b "sincerely yours",
0x400500 <_start> "1\355I\211\321^H\211\342H\203\344\360PTI\307\300\340\006@"}

 

這個技巧不只對 const char* 陣列有用,

對所有類型的陣列 (像是 struct 組成的陣列) 也都能這麼檢查內容喔~^^

(本頁面已被瀏覽過 300 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料