2015-05-09 101 views
9

这里是我的disas代码:GDB不能访问内存地址错误

0x0804844d <+0>:  push %ebp 
    0x0804844e <+1>:  mov %esp,%ebp 
    0x08048450 <+3>:  and $0xfffffff0,%esp 
    0x08048453 <+6>:  sub $0x20,%esp 
    0x08048456 <+9>:  movl $0x8048540,(%esp) 
    0x0804845d <+16>: call 0x8048310 <[email protected]> 
    0x08048462 <+21>: lea 0x1c(%esp),%eax 
    0x08048466 <+25>: mov %eax,0x4(%esp) 
    0x0804846a <+29>: movl $0x8048555,(%esp) 
    0x08048471 <+36>: call 0x8048320 <[email protected]> 
    0x08048476 <+41>: mov 0x1c(%esp),%eax 
    0x0804847a <+45>: cmp $0x208c,%eax 
    0x0804847f <+50>: jne 0x804848f <main+66> 
    0x08048481 <+52>: movl $0x8048558,(%esp) 
    0x08048488 <+59>: call 0x8048310 <[email protected]> 
    0x0804848d <+64>: jmp 0x804849b <main+78> 
=> 0x0804848f <+66>: movl $0x8048569,(%esp) 
    0x08048496 <+73>: call 0x8048310 <[email protected]> 
    0x0804849b <+78>: mov $0x0,%eax 
    0x080484a0 <+83>: leave 
    0x080484a1 <+84>: ret 

什么,我特林检查为$ 0x208c。当我键入x/xw 0x208c时,它给我回错误,说错误地址0x208c无法访问内存。当我输入Info寄存器并查看eax时,它会显示我提供的值。所以基本上这个程序比较两个值,并根据这些值打印出来。问题是,这是来自大学的作业,我没有得到代码。希望你能帮助。谢谢。

+1

[手指在空中]你传递了一个非法参数?你坐在那里,在调试器前面。我们可以做什么,你不能,特别是没有源代码?这是一个非常奇怪的任务,要求你解决没有源的东西... –

+0

我终于想出使用打印语句,而不是x/xw可以请你解释为什么打印工作和x没有? – Ojs

+0

$ 0x208c是绝对值,不是内存地址! –

回答

12

当我键入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的值)。

3

我发现不可能检查mmap ed内存没有PROT_READ标志。这不是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); 

,瞧,可以检查内存。

0

未初始化的指针

正是在回顾那种显而易见的,但是这是什么导致GDB表明,错误信息给我。沿着:

#include <stdio.h> 

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 

但在过程中的一个复杂的程序,并且其中地址是随机的东西不同于零。