2008-10-12 8 views
1

J'écris un outil de traçage qui doit gérer la sortie d'un JIT, de sorte que la pile peut sembler assez bizarre parfois. Je voudrais essayer d'appliquer des heuristiques aux adresses pour déterminer s'il s'agit de code, de données ou d'ordures. (Si je me trompe de temps en temps, ce n'est pas grave, mais si le processus se bloque, pas tellement.)Comment pouvez-vous vérifier efficacement le mappage de machine virtuelle pour une adresse?

Je peux cat /proc/«pid»/maps pour obtenir une liste des mappages VM pour un processus sous Linux. Est-il possible d'accéder à ces informations (ou à n'importe quel sous-ensemble) depuis l'intérieur du processus sans analyser ce fichier? Il serait idéal d'examiner les bits rwx pour une adresse. Essentiellement, je veux une version "read" de mprotect(2).

Si je ne peux pas faire cela, que diriez-vous de déterminer si un accès à une certaine adresse provoquera une erreur de segmentation? (Il y a déjà un gestionnaire SIGSEGV installé dans ce cas et je ne peux pas facilement l'écraser, ou je le ferais juste.)

Répondre

2

En regardant à travers toutes les fonctions liées à la mémoire j'ai découvert que je peux utiliser munlock() pour déterminer si la page est valide.

bool is_address_valid(ADDRINT addr) { 
    static int pagesize = getpagesize(); 

    const void *foo = (const void *)(addr/pagesize * pagesize); 

    if (munlock(foo, 1) == -1) { 
    fprintf(stderr, "munlock(%p=>%p, 1) failed: %s\n", addr, foo, 
      strerror(errno)); 
    return false; 
    } 
    return true; 
} 

Assez dégoûtant, mais cela empêche mon code de se bloquer.

Questions connexes