在這裏,我檢查C語言編寫的一個簡單的程序,節省了字符指針,上面寫着一串GDB問題「你好,世界!\ n」個與C程序
這裏是我的GDB的輸出..我很困惑,在GDB的不一致,什麼是正確的位置:
$ gcc -g pointer.c
$ gdb -q ./a.out
Reading symbols for shared libraries .. done
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str[20];
6 char *pointer;
7
8 strcpy(str, "Hello, world!\n");
9 pointer = str;
10 printf("%s",pointer);
(gdb)
11 }
(gdb) break 10
Breakpoint 1 at 0x100000ed1: file pointer.c, line 10.
(gdb) run
Starting program: /Users/___/a.out
Reading symbols for shared libraries +. done
Breakpoint 1, main() at pointer.c:10
10 printf("%s",pointer);
(gdb) print pointer
$1 = 0x7fff5fbff950 "Hello, world!\n"
(gdb) print &pointer
$2 = (char **) 0x7fff5fbff948
(gdb) x/s 0x7fff5fbff950
0x7fff5fbff950: "Hello, world!\n"
(gdb) x/16b 0x7fff5fbff950
0x7fff5fbff950: "Hello, world!\n"
0x7fff5fbff95f: ""
0x7fff5fbff960: "x??_?"
0x7fff5fbff967: ""
0x7fff5fbff968: "՝?Y4?K\033???_?"
0x7fff5fbff977: ""
0x7fff5fbff978: "?\016"
0x7fff5fbff97b: ""
0x7fff5fbff97c: "\001"
0x7fff5fbff97e: ""
0x7fff5fbff97f: ""
0x7fff5fbff980: ""
0x7fff5fbff981: ""
0x7fff5fbff982: ""
0x7fff5fbff983: ""
0x7fff5fbff984: ""
(gdb) x/x 0x7fff5fbff950
0x7fff5fbff950: 0x48
(gdb) x/x 0x7fff5fbff951
0x7fff5fbff951: 0x65
(gdb) x/s 0x7fff5fbff951
0x7fff5fbff951: "ello, world!\n"
(gdb) print &pointer
$3 = (char **) 0x7fff5fbff948
(gdb) x/x 0x7fff5fbff948
0x7fff5fbff948: 0x00007fff5fbff950
(gdb) x/x 0x7fff5fbff949
0x7fff5fbff949: 0x4800007fff5fbff9
(gdb) x/2x 0x00007fff5fbff950
0x7fff5fbff950: 0x77202c6f6c6c6548 0x00000a21646c726f
我的問題是:
的信息有多少字節存儲在存儲器中,這些位置中的一個?當我在地址 0x7fff5fbff950,內容似乎是0x48(ASCII「H」)。那麼這是否意味着,每個內存地址只存儲一個字節的信息?好。我們假設它的確如此。然後,我對打印&指針給出的地址運行相同的「X/X」命令:我值0x00007fff5fbff950,這點我承認(忽略前導零)0x7fff5fbff948
是「你好,世界的開始! \ n「內存中的字符串。
現在怎麼能0x00007fff5fbff948包含0x00007fff5fbff950,仍然有內存只有一個字節?所以我看看0x00007fff5fbff949 ...現在這又告訴我,我們每次只看一個字節,因爲我們失去了尾隨的0x50(我知道小端,所以也許我的措辭容易混淆)。
現在我得到真的瘋了......我嘗試做X/2X 0x7fff5fbff948,我有兩個巨大的十六進制數襲擊......在一個時間
所以在內存中的數據存儲字節,並以某種方式x/x有時會給我每個內存一個字節,有時會給我一個完整的地址?我怎樣才能控制調試器輸出的內容? x/x應檢查此地址的內容並以十六進制輸出。我可以用x/B爲一個單字節,X/2B 2個字節......但X/2倍意味着什麼?
對不起意識流的問題..希望有人能幫我清楚這一點。
首先,感謝您的回覆。 好但兩個64位整數清楚地對應於兩個8字節的整數。由於每個字節都有其獨特的地址,如果我做x/2x並在地址____48和____50處打印兩個64位整數,則意味着應該與______48和______50重疊,並且在48的第三個字節中看不到任何重疊和50的第一個字節,然後。你能幫忙解釋一下嗎? – ae0709 2011-05-24 01:16:31
爲什麼會有重疊? '0x50 - 0x48 = 8',即八個字節。 – 2011-05-24 01:33:23
:)謝謝。愚蠢的錯誤...忘了我們在16歲。 – ae0709 2011-05-24 01:49:06