2010-02-16 15 views
8

Estoy intentando depurar un programa que he escrito. De acuerdo con el depurador, un particular void * tiene el valor 0x804b008. Me gustaría poder desreferenciar este valor (convertirlo a int * y obtener su valor).Desreferencia ubicación de memoria arbitraria en C

Recibo un error de segmentación con este código. (El programa con el void * todavía se está ejecutando en segundo plano por cierto - es 'pausa')

#include <stdio.h> 

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

puedo ver por qué ser capaz de deferencia cualquier punto en la memoria podría ser peligroso y quizás por qué esto no está funcionando .

¡Gracias!

Respuesta

7

Su programa (ejecutándose en el depurador) y este no se ejecutará en el mismo espacio de memoria virtual; acceder a ese puntero (incluso si fuera válido) no le dará ninguna información.

Cada programa que se ejecuta en su máquina tiene su propio espacio de direcciones lógicas. Su sistema operativo, el tiempo de ejecución del lenguaje de programación y otros factores pueden afectar los valores literales reales que ve utilizados como indicadores para cualquier programa dado. Pero un programa definitivamente no puede ver en el espacio de memoria de otro programa, salvo por supuesto los depuradores de software, que hacen algunos trucos especiales para admitir este comportamiento.

En cualquier caso, su depurador debería permitirle ver la memoria que desee mientras el programa está en pausa, suponiendo que tenga una dirección válida. En gdb x/x 0x804b008 obtendría lo que desea ver.

Para más información:

  1. artículo de Wikipedia sobre Virtual Memory.
  2. gdb documentation
+0

He leído un poco sobre el desarrollo del sistema operativo, así que creo que entiendo de lo que me estás hablando. ¿Está esta memoria virtual ubicada en la RAM, solo asignada a un esquema de direccionamiento diferente o algo más? Gracias de nuevo. EDIT: ¡Respondió mi pregunta antes de que siquiera se la pidiera! – Tyler

+0

La memoria virtual solo significa que, en lo que a usted respecta, al escribir un programa, tiene un buen espacio de memoria contigua. El sistema operativo maneja toda la fragmentación de memoria potencial para usted. –

+0

Gracias. Yo junté tanto. Estaba más interesado en * cómo * se implementa en el nivel del sistema operativo. http://en.wikipedia.org/wiki/Virtual_memory#Page_tables parece ser la forma en que se hace. Gracias – Tyler

0

es bastante simple. El sistema operativo sabe que la dirección no pertenece a su programa, por lo que no puede imprimir sin pasar por alto la protección de memoria.

Cuestiones relacionadas