Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 用C语言编程的GDB问题_Assembly_Gdb_X86 64_X86 - Fatal编程技术网

Assembly 用C语言编程的GDB问题

Assembly 用C语言编程的GDB问题,assembly,gdb,x86-64,x86,Assembly,Gdb,X86 64,X86,这里,我正在研究一个用C编写的简单程序,该程序保存一个指向字符串的字符指针,该字符串表示“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

这里,我正在研究一个用C编写的简单程序,该程序保存一个指向字符串的字符指针,该字符串表示“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
$gcc-g pointer.c
$gdb-q./a.out
正在读取共享库的符号。。完成
(gdb)清单
1#包括
2#包括
3.
4 int main(){
5个字符str[20];
6个字符*指针;
7.
8 strcpy(str,“你好,世界!\n”);
9指针=str;
10 printf(“%s”,指针);
(gdb)
11  }
(gdb)突破10
0x100000ed1处的断点1:file pointer.c,第10行。
(gdb)运行
正在启动程序:/Users/\uuuuu\a.out
读取共享库的符号+。完成
断点1,指针处的main().c:10
10 printf(“%s”,指针);
(gdb)打印指针
$1=0x7fff5fbff950“你好,世界!\n”
(gdb)打印和指针
$2=(字符**)0x7fff5fbff948
(gdb)x/s 0x7fff5fbff950
0x7fff5fbff950:“你好,世界!\n”
(gdb)x/16b 0x7fff5fbff950
0x7fff5fbff950:“你好,世界!\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:“埃洛,世界!\n”
(gdb)打印和指针
$3=(字符**)0x7fff5fbff948
(gdb)x/x 0x7fff5fbff948
0x7fff5fbff948:0x00007fff5fbff950
(gdb)x/x 0x7fff5fbff949
0x7fff5fbff949:0x4800007fff5fbff9
(gdb)x/2x 0x00007fff5fbff950
0x7fff5fbff950:0x77202C6F6C6548 0x00000a21646c726f
我的问题是:

内存中这些位置之一存储了多少字节的信息?当我在那个地址的时候 0x7fff5fbff950,内容显示为0x48(ASCII“H”)。那么,这是否意味着,每个内存地址只存储一个字节的信息?好啊让我们假设是这样。然后在print&pointer给出的地址上运行相同的“x/x”命令:0x7fff5fbff948

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

现在,0x00007fff5fbff948如何包含0x00007fff5fbff950而仍然只有一个字节的内存?所以我看0x00007fff5fbff949。。。这再一次告诉我,我们每次只看一个字节,因为我们丢失了尾随的0x50(我知道little endian,所以可能我的措辞有点混乱)

现在我真的很生气。。。我尝试做x/2x 0x7fff5fbff948,我被两个巨大的十六进制数字攻击

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


对于意识流问题,我很抱歉。。希望有人能帮我澄清一下。

内存是字节可寻址的,这意味着每个字节都有一个不同的地址。然后,您可以将一对字节解释为16位整数,将四个字节解释为32位整数,等等。格式说明符允许您这样做—根据您对内存的解释打印内存内容。因此,
x/2x 0x7fff5fbff948
将打印两个字长(此处为64位)的整数,第一个在地址
0x7fff5fbff948
,第二个在地址
0x7fff5fbff950
,首先感谢您的回复。好的,但两个64位整数显然对应于两个8字节整数。由于每个字节都有其不同的地址,如果我做x/2x并在地址48和50处打印两个64位整数,这意味着应该与地址48和50重叠,而48的第三个字节和50的第一个字节和50的第二个字节没有重叠。你能解释一下吗?为什么会有重叠<代码>0x50-0x48=8,即八个字节。:)谢谢。愚蠢的错误。。。忘了我们在16垒。