Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Debugging 为什么GDB“x/w”和“x/g”显示不同的值?_Debugging_Assembly_Memory_Gdb_X86 64 - Fatal编程技术网

Debugging 为什么GDB“x/w”和“x/g”显示不同的值?

Debugging 为什么GDB“x/w”和“x/g”显示不同的值?,debugging,assembly,memory,gdb,x86-64,Debugging,Assembly,Memory,Gdb,X86 64,在我的程序中,有一个点,它将rbp-0x84中存储的变量与0x1进行比较。 然而,当我去查看那里有什么时,我得到了相互矛盾的结果 gef➤ x/w $rbp-0x84 0x7fffffffdf5c: 0x00000000 gef➤ x/g $rbp-0x84 0x7fffffffdf5c: 0x0000000500000000 前8位如何从0x0更改为0x5 这就引出了我的下一个问题。。。当我尝试时: gef➤ set $rbp-0x84 = 0x1 gef➤ x $rbp-0x84

在我的程序中,有一个点,它将rbp-0x84中存储的变量与0x1进行比较。 然而,当我去查看那里有什么时,我得到了相互矛盾的结果

gef➤  x/w $rbp-0x84
0x7fffffffdf5c: 0x00000000
gef➤  x/g $rbp-0x84
0x7fffffffdf5c: 0x0000000500000000
前8位如何从0x0更改为0x5

这就引出了我的下一个问题。。。当我尝试时:

gef➤  set $rbp-0x84 = 0x1
gef➤  x $rbp-0x84
0xffffffffffffff7d: Cannot access memory at address 0xffffffffffffff7d
地址是如何从0x7FFFFFFF5C变为0xFFFFFFFF7D的?

0x000000050000000的低位32位都是零。x86是little endian。gdb巨型x86 qword中高gdb工作x86 dword的前8位为5

转储为单个字节以查看此信息,如x/8xb

由于$rbp-0x84是0xff…,因此设置$rbp-0x84=0x1似乎会将寄存器本身修改为某个小数字,因此x$rbp-0x84会换行

它不会修改内存,因为您没有将其作为指针值取消引用,比如*long*$rbp-0x84=1。x包含一个隐式解引用,它接受一个指针arg并显示内存。设置和打印不需要

不过,我很惊讶,作业的左侧竟然有一个表情。这在C中是不允许的,但显然GDB允许这样做。事实上,我进行了测试,它在GDB9.1中生成$rbp=1

更改为RBP后,$RBP-0x84是一个略低于0的数字,即0xff。。。。。请注意,它不是0x7f。。。再也没有了,而且范围更广。此页未映射。和有趣的事实;Linux永远不会允许您映射该虚拟页面,即使在内核中也是如此,因为该范围内的值被视为错误代码,而不是有效指针


脚注1:用户空间虚拟地址最多47位宽,直到PML5 CPU具有如此多的RAM,以至于操作系统选择使用额外级别的页表。Linux将堆栈放在最上面。

显然,将$rbp-0x84=0x1 modified rbp设置为1-0x84…@MartinRosenau对于无效的C语法来说,这一点都不明显,事实上也不是这样。我自己尝试过gdb/bin/ls;斯塔蒂。。。结果是$rbp=0x1,很明显,我不想说set显然是这样工作的。我想说的是,根据OP提供的信息,很明显,这个时间集是这样工作的。但是,我犯了一个错误:rbp没有设置为0xFFF…F7D,而是设置为1。因此,将$rbp-0x84=0x1修改后的rbp设置为1,而不是1-0x84。