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
您似乎不理解print
和examine
命令之间的区别。 考虑这个例子:
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
但在一个复杂的程序当然,地址是零随机的不同之处。