gdb内存地址与程序打印出的内存地址不匹配
gdb memory addresses not matching memory address printed out by program
我有一个像这样的基本 C 程序:
#include <stdio.h>
int main()
{
int cookie;
char buf[80];
printf("A: %x B: %x\n", &buf, &cookie);
gets(buf);
if (cookie == 0x11111111){
printf("You win!\n");
} else {
printf("THIS Didn't WORK");
}
}
当我运行它时,打印语句打印A: efbffab0 B: efbffb08
然而,如果我在 gdb 中打开这个程序并探索任何变量的内存地址,我得到的值比 C 程序打印出的值更长:
Thread 2 hit Breakpoint 1, main () at challenge.c:10
10 if (cookie == 0x41424344){
(gdb) x/50x &buf
0x7ffeefbffab0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffac0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffad0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffae0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffaf0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffb00: 0x41424344 0x00007f00 0x00011025 0x00000000
0x7ffeefbffb10: 0xefbffb28 0x00007ffe 0x20545f3d 0x00007fff
0x7ffeefbffb20: 0x20545f3d 0x00007fff 0x00000000 0x00000000
0x7ffeefbffb30: 0x00000001 0x00000000 0xefbffcb0 0x00007ffe
0x7ffeefbffb40: 0x00000000 0x00000000 0xefbffd09 0x00007ffe
0x7ffeefbffb50: 0xefbffd4b 0x00007ffe 0xefbffd65 0x00007ffe
0x7ffeefbffb60: 0xefbffd74 0x00007ffe 0xefbffd85 0x00007ffe
0x7ffeefbffb70: 0xefbffdce 0x00007ffe
为什么我的 C 程序地址 0xefbffab0
与 gdb 给我的地址 0x7ffeefbffab0
不匹配?
0x7ffe
前缀从何而来?
您使用了错误的格式说明符来打印指针。 x
说明符用于 unsigned int
,在您的系统上它是 32 位的,因此只打印地址的一部分(但这只是巧合,使用错误的格式说明符是未定义的行为)。你要的那个是p
,是给void *
:
的
printf("A: %p B: %p\n", &buf, &cookie);
我有一个像这样的基本 C 程序:
#include <stdio.h>
int main()
{
int cookie;
char buf[80];
printf("A: %x B: %x\n", &buf, &cookie);
gets(buf);
if (cookie == 0x11111111){
printf("You win!\n");
} else {
printf("THIS Didn't WORK");
}
}
当我运行它时,打印语句打印A: efbffab0 B: efbffb08
然而,如果我在 gdb 中打开这个程序并探索任何变量的内存地址,我得到的值比 C 程序打印出的值更长:
Thread 2 hit Breakpoint 1, main () at challenge.c:10
10 if (cookie == 0x41424344){
(gdb) x/50x &buf
0x7ffeefbffab0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffac0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffad0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffae0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffaf0: 0x41424344 0x41424344 0x41424344 0x41424344
0x7ffeefbffb00: 0x41424344 0x00007f00 0x00011025 0x00000000
0x7ffeefbffb10: 0xefbffb28 0x00007ffe 0x20545f3d 0x00007fff
0x7ffeefbffb20: 0x20545f3d 0x00007fff 0x00000000 0x00000000
0x7ffeefbffb30: 0x00000001 0x00000000 0xefbffcb0 0x00007ffe
0x7ffeefbffb40: 0x00000000 0x00000000 0xefbffd09 0x00007ffe
0x7ffeefbffb50: 0xefbffd4b 0x00007ffe 0xefbffd65 0x00007ffe
0x7ffeefbffb60: 0xefbffd74 0x00007ffe 0xefbffd85 0x00007ffe
0x7ffeefbffb70: 0xefbffdce 0x00007ffe
为什么我的 C 程序地址 0xefbffab0
与 gdb 给我的地址 0x7ffeefbffab0
不匹配?
0x7ffe
前缀从何而来?
您使用了错误的格式说明符来打印指针。 x
说明符用于 unsigned int
,在您的系统上它是 32 位的,因此只打印地址的一部分(但这只是巧合,使用错误的格式说明符是未定义的行为)。你要的那个是p
,是给void *
:
printf("A: %p B: %p\n", &buf, &cookie);