2010-02-16 16 views
8

Sto provando a eseguire il debug di un programma che ho scritto. Secondo il debugger, un particolare void * contiene il valore 0x804b008. Mi piacerebbe essere in grado di dereferenziare questo valore (trasmetterlo a un valore int * e ottenere il suo valore).Posizione memoria arbitraria con dereference in C

Ricevo un errore di segmentazione con questo codice. (Il programma con il void * è ancora in esecuzione in background btw - è 'pausa')

#include <stdio.h> 

int main() { 
    int* pVal = (int *)0x804b008; 
    printf("%d", *pVal); 
} 

Posso capire perché essendo in grado di deferenza qualsiasi punto in memoria potrebbe essere pericoloso, quindi forse è per questo questo non sta funzionando .

Grazie!

risposta

7

Il programma (in esecuzione nel debugger) e questo non verrà eseguito nello stesso spazio di memoria virtuale; l'accesso a quel puntatore (anche se valido) non ti darà alcuna informazione.

Ogni programma in esecuzione sulla propria macchina ha il proprio spazio di indirizzamento logico. Il tuo sistema operativo, il linguaggio di programmazione in fase di esecuzione e altri fattori possono influire sui valori letterali reali che vedi usati come puntatori per ogni dato programma. Ma un programma sicuramente non può vedere nello spazio di memoria di un altro programma, salvo ovviamente i debugger del software, che fanno alcuni trucchi speciali per supportare questo comportamento.

In ogni caso, il debugger dovrebbe consentire di vedere qualsiasi memoria desiderata mentre il programma è in pausa, presupponendo che si disponga di un indirizzo valido. In gdb x/x 0x804b008 otterresti quello che vuoi vedere.

Per maggiori informazioni:

  1. voci di Wikipedia Virtual Memory.
  2. gdb documentation
+0

Ho letto un po 'di sviluppo del sistema operativo, quindi credo di capire un po' di cosa stai parlando. Questa memoria virtuale si trova nella RAM, semplicemente mappata a un diverso schema di indirizzamento o qualcos'altro? Grazie ancora. EDIT: Ho risposto alla mia domanda prima ancora che me lo chiedessi! – Tyler

+0

La memoria virtuale significa semplicemente che per quanto riguarda la scrittura di un programma, si dispone di uno spazio di memoria contiguo. Il sistema operativo gestisce tutta la potenziale frammentazione della memoria per te. –

+0

Grazie. Ho raccolto tanto. Ero più interessato a * come * è implementato a livello di sistema operativo. http://en.wikipedia.org/wiki/Virtual_memory#Page_tables sembra essere come è fatto. Grazie – Tyler

0

è abbastanza semplice. Il sistema operativo sa che l'indirizzo non appartiene al tuo programma, quindi non puoi stamparlo senza bypassare la protezione della memoria.

Problemi correlati