gdb无法访问内存地址错误

这是我的disas代码:

0x0804844d : push %ebp 0x0804844e : mov %esp,%ebp 0x08048450 : and $0xfffffff0,%esp 0x08048453 : sub $0x20,%esp 0x08048456 : movl $0x8048540,(%esp) 0x0804845d : call 0x8048310  0x08048462 : lea 0x1c(%esp),%eax 0x08048466 : mov %eax,0x4(%esp) 0x0804846a : movl $0x8048555,(%esp) 0x08048471 : call 0x8048320  0x08048476 : mov 0x1c(%esp),%eax 0x0804847a : cmp $0x208c,%eax 0x0804847f : jne 0x804848f  0x08048481 : movl $0x8048558,(%esp) 0x08048488 : call 0x8048310  0x0804848d : jmp 0x804849b  => 0x0804848f : movl $0x8048569,(%esp) 0x08048496 : call 0x8048310  0x0804849b : mov $0x0,%eax 0x080484a0 : leave 0x080484a1 : ret 

我要检查的是$ 0x208c。 当我输入x / xw 0x208c时,它会返回错误,表示无法访问地址0x208c处的内存。 当我输入Info寄存器并查看eax时,它会显示我提供的值。 所以基本上这个程序比较两个值,并根据打印出来的东西。问题是这是大学的家庭作业,我没有代码。 希望你能帮忙。 谢谢。

当我输入x/xw 0x208c它会返回错误,表示Cannot access memory at address 0x208c

你的程序的反汇编说它做了这样的事情:

 puts("some string"); int i; scanf("%d", &i); // I don't know what the actual format string is. // You can find out with x/s 0x8048555 if (i == 0x208c) { ... } else { ... } 

换句话说, 0x208c是您的程序在其中硬编码的值( 8332 ),而不是指针。 因此,GDB完全正确地告诉您如果将0x208c解释为指针,则该指针不指向可读内存。

我终于想通了使用print语句而不是x / xw

您似乎不理解printexamine命令之间的区别。 考虑这个例子:

 int foo = 42; int *pfoo = &foo; 

在上面, print pfoo将为您提供foo地址x pfoo将为您提供存储在该地址的值(即foo的值)。

我发现无法检查没有PROT_READ标志的mmap ed内存。 这不是OP问题,但它是我的,错误信息是相同的。

代替

 mmap(0, size, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); 

 mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); 

瞧,可以检查记忆。

未初始化的指针

这在回顾展中是显而易见的,但这是导致GDB向我显示错误消息的原因。 沿:

 #include  int main(void) { int *p; printf("*p = %d\n", *p); } 

然后:

 gdb -q -nh -ex run ./tmp.out Reading symbols from ./tmp.out...done. Starting program: /home/ciro/bak/git/cpp-cheat/gdb/tmp.out Program received signal SIGSEGV, Segmentation fault. 0x0000555555554656 in main () at tmp.c:5 5 printf("*p = %d\n", *p); (gdb) print *p Cannot access memory at address 0x0 

但在一个复杂的程序当然,地址是零随机的不同之处。