使用C程序的GDB问题

时间:2011-05-24 00:35:00

标签: assembly gdb x86-64 ia-32

这里我正在研究一个用C编写的简单程序,该程序将char指针保存到一个字符串,表示“Hello,world!\ n”

这是我的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”)。那么这意味着,每个内存地址只存储一个字节的信息吗?好。我们假设它确实如此。然后我在print&amp; pointer给出的地址上运行相同的“x / x”命令:0x7fff5fbff948

我得到了值0x00007fff5fbff950,我认为(忽略前导零)是内存中“Hello,world!\ n”字符串的开头。

现在0x00007fff5fbff948如何包含0x00007fff5fbff950并且仍然只有一个字节的内存?所以我看一下0x00007fff5fbff949 ......现在再次告诉我,我们每次都只看一个字节,因为我们丢失了尾随的0x50(我知道小端,所以也许我这句话容易混淆)。

现在我真的很生气......我尝试做x / 2x 0x7fff5fbff948而且我受到两个巨大的十六进制数字攻击......

所以内存中的数据一次存储一个字节,不知怎的,x / x有时会给每个内存一个字节,有时会给我一个完整的地址?如何控制调试器输出的内容? x / x应检查此地址的内容并以十六进制输出。我可以将x / b用于单个字节,x / 2b用于2个字节......但x / 2x意味着什么?

对于意识流问题感到抱歉..希望有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

内存字节可寻址意味着每个字节都有一个不同的地址。然后,您可以解释将一对字节称为16位整数,将四个字节称为32位整数等。该格式说明符可让您这样做 - 根据您的内容打印内存解释它。因此x/2x 0x7fff5fbff948将打印两个字大小(此处为64位)的整数,首先是地址0x7fff5fbff948,第二个是地址0x7fff5fbff950