2010-02-16 5 views
8

J'essaie de déboguer un programme que j'ai écrit. Selon le débogueur, un void * particulier contient la valeur 0x804b008. J'aimerais pouvoir déréférencer cette valeur (jetez-la à int * et obtenez-en la valeur).Détection de l'emplacement de la mémoire arbitraire dans C

Je reçois une erreur de segmentation avec ce code. (Le programme avec le void * est toujours en cours d'exécution en arrière-plan BTW - il est « en pause »)

#include <stdio.h> 

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

Je peux voir pourquoi être en mesure de déférence tout point dans la mémoire pourrait être dangereux si peut-être pourquoi cela ne fonctionne pas .

Merci!

Répondre

7

Votre programme (exécuté dans le débogueur) et celui-ci ne s'exécuteront pas dans le même espace mémoire virtuel; l'accès à ce pointeur (même s'il était valide) ne vous donnera aucune information.

Chaque programme exécuté sur votre machine possède son propre espace d'adressage logique. Votre système d'exploitation, l'exécution du langage de programmation et d'autres facteurs peuvent affecter les valeurs littérales réelles que vous voyez utilisées comme pointeurs pour un programme donné. Mais un programme définitivement ne peut pas voir dans l'espace mémoire d'un autre programme, à l'exception bien sûr des débogueurs logiciels, qui font des trucs spéciaux pour supporter ce comportement. Dans tous les cas, votre débogueur devrait vous laisser voir la mémoire que vous voulez pendant que votre programme est en pause - en supposant que vous avez une adresse valide. En gdb x/x 0x804b008 vous obtiendriez ce que vous voulez voir.

Pour plus d'informations:

  1. article de Wikipédia sur Virtual Memory.
  2. gdb documentation
+0

J'ai lu un peu sur le développement du système d'exploitation, donc je crois que je comprends un peu ce dont vous parlez. Est-ce que cette mémoire virtuelle est située dans la RAM - juste mappée à un schéma d'adressage différent ou autre chose? Merci encore. EDIT: J'ai répondu à ma question avant même que je le demande! – Tyler

+0

La mémoire virtuelle signifie simplement qu'en ce qui vous concerne lorsque vous écrivez un programme, vous disposez d'un espace mémoire contigu. Le système d'exploitation gère toute la fragmentation de mémoire potentielle pour vous. –

+0

Merci. Je me suis réuni autant. J'étais plus intéressé par * comment * il est implémenté au niveau de l'OS. http://en.wikipedia.org/wiki/Virtual_memory#Page_tables semble être comment c'est fait. Merci – Tyler

0

Il est tout à fait simple. Le système d'exploitation sait que cette adresse n'appartient pas à votre programme, vous ne pouvez donc pas l'imprimer sans contourner la protection de la mémoire.

Questions connexes