[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 組成的陣列) 也都能這麼檢查內容喔~^^
(本頁面已被瀏覽過 746 次)