Domanda

Sto cercando di eseguire il debug di un programma che ho scritto. Secondo il debugger una particolare void * detiene il 0x804b008 valore. Mi piacerebbe essere in grado di risolvere il riferimento di questo valore (lo gettò a un int * e ottenere il suo valore).

sto ottenendo 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 che non funziona.

Grazie!

È stato utile?

Soluzione

Il programma (in esecuzione nel debugger) e questo non sarà in esecuzione nello stesso spazio di memoria virtuale; Accedendo tale puntatore (anche se si trattasse di uno valido) non vi darà alcuna informazione.

Ogni programma in esecuzione sul computer dispone di un proprio spazio di indirizzamento logico. Il sistema operativo, il runtime linguaggio di programmazione, e di altri fattori possono influenzare i valori effettivi letterali che si vedono usati come punti di riferimento per un determinato programma. Ma un programma sicuramente non può vedere nello spazio di memoria di un altro programma, il blocco del debugger software corso, che fanno alcuni trucchi speciali per sostenere questo comportamento.

In ogni caso, il debugger dovrebbe farvi vedere tutto quello che vuoi memoria mentre il programma è in pausa - a patto di avere un indirizzo valido. In gdb x/x 0x804b008 sarebbe ottenere ciò che si vuole vedere.

Per ulteriori informazioni:

    articolo
  1. memoria virtuale .
  2. gdb documentazione

Altri suggerimenti

E 'abbastanza semplice. Il sistema operativo sa che l'indirizzo non appartiene al vostro programma, quindi non è possibile stamparlo senza bypass protezione della memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top