2015-05-09 8 views
9

geht es hier ist mein Demon Code:GDB kann nicht Speicheradressfehler

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 

was ich Tring ist 0x208c $ zu untersuchen. Wenn ich x/xw 0x208c eintippe, gibt es mir einen Fehler zurück, der besagt, dass auf Speicher unter Adresse 0x208c nicht zugegriffen werden kann. Wenn ich Info-Register schreibe und auf eax schaue, steht der Wert, den ich angegeben habe. Also im Grunde vergleicht dieses Programm zwei Werte und je nachdem druckt das etwas aus. Das Problem ist, dass dies Hausaufgaben von der Universität sind und ich keinen Code habe. Hoffe du kannst helfen. Vielen Dank.

+1

[Finger in der Luft] Sie übergeben einen ungültigen Parameter? Du sitzt dort, vor dem Debugger. Was können wir herausfinden, dass Sie nicht können, vor allem ohne Quellcode? Es ist eine sehr seltsame Aufgabe, die Sie bittet, Sachen ohne Quelle zu reparieren ... –

+0

Ich fand schließlich heraus, Druckanweisung statt x/xw zu verwenden, können Sie bitte erklären, warum Druck funktionierte und x nicht? – Ojs

+0

$ 0x208c ist ein absoluter Wert, keine Speicheradresse! –

Antwort

12

Wenn ich x/xw 0x208c geben es gibt mir wieder Fehler, der sagt Cannot access memory at address 0x208c

Die Demontage für Ihr Programm sagt, dass es so etwas wie dies funktioniert:

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 { ... } 

Mit anderen Worten, die 0x208c ist ein Wert (8332), den Ihr Programm fest codiert hat, und ist nicht ein Zeiger. Daher ist GDB vollkommen richtig, wenn er Ihnen sagt, dass wenn Sie 0x208c als einen Zeiger interpretieren, dieser Zeiger nicht auf lesbaren Speicher zeigt.

i findet schließlich statt print-Anweisung zu verwenden, aus x/x B

Sie scheinen nicht den Unterschied zwischen print und examine Befehlen zu verstehen. Betrachten Sie folgendes Beispiel:

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

Mit oben print pfoo geben Ihnen die Adresse von foo und x pfoo geben Ihnen die Wert an dieser Adresse gespeichert (das heißt der Wert von foo).

3

Ich fand heraus, dass es unmöglich ist, mmap ED-Speicher zu untersuchen, der PROT_READ Flag nicht hat. Dies ist nicht das OP-Problem, aber es war meins, und die Fehlermeldung ist die gleiche.

Statt

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

tun

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

und voila, kann der Speicher überprüft werden.

0

Uninitialized Zeiger

Es ist ziemlich offensichtlich in retrospektiv, aber das ist, was GDB verursacht wurde mir die Fehlermeldung zu zeigen. Zusammen:

#include <stdio.h> 

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

Und dann:

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 

Aber in einem komplexen Programm natürlich, und wo die Adresse war etwas zufällig von Null verschieden.