gdb non può accedere all’errore di indirizzo di memoria

ecco il mio codice di disass:

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 

quello che sto cercando di esaminare è $ 0x208c. Quando digito x / xw 0x208c mi restituisce un errore che dice che non si può accedere alla memoria all’indirizzo 0x208c. Quando digito i registri Info e guardo EA dice il valore che ho fornito. Quindi, in pratica, questo programma confronta due valori e, a seconda di ciò, stampa qualcosa. Il problema è che si tratta di compiti dall’università e non ho il codice. Spero che tu possa aiutare Grazie.

Quando x/xw 0x208c mi restituisce un errore che dice che Cannot access memory at address 0x208c

Lo sassembly del tuo programma dice che fa qualcosa del genere:

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

In altre parole, 0x208c è un valore ( 8332 ) che il programma ha codificato in esso e non è un puntatore. Pertanto, GDB è del tutto corretto nel 0x208c che se interpreti 0x208c come puntatore, quel puntatore non punta alla memoria leggibile.

Alla fine ho capito di usare l’istruzione print invece di x / xw

Sembra che tu non capisca la differenza tra print comandi print ed examine . Considera questo esempio:

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

Con sopra, print pfoo ti darà l’ indirizzo di foo , e x pfoo ti darà il valore memorizzato a quell’indirizzo (cioè il valore di foo ).

Ho scoperto che è imansible esaminare mmap memoria mmap ed che non ha flag PROT_READ . Questo non è il problema degli OP, ma era mio e il messaggio di errore è lo stesso.

Invece di

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

fare

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

e voilà, la memoria può essere esaminata.

Puntatori non inizializzati

È abbastanza ovvio in retrospettiva, ma questo è ciò che stava causando a GDB di mostrare quel messaggio di errore. Lungo:

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

E poi:

 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 

Ma in un programma complesso, ovviamente, e in cui l’indirizzo era qualcosa di casuale diverso da zero.