Domanda

I sono il debug del codice di Linux C in un gestore di segnale per il galleggiamento eccezioni point. L'obiettivo è quello di controllare i registri in virgola mobile, stampare alcune informazioni, e quindi interrompere. Ottengo un errore di segmentazione quando si tenta di printf il risultato di (char)('0' + phyreg).

struct ucontext *   uc = (struct ucontext *) data;
fpregset_t      fp = uc -> uc_mcontext.fpregs;

int top = (fp -> sw >> 11) & 0x07;
int i,j,k;
for (i = 0; i < 8; i++) {
    static const char * tags [] = {
        "valid", "zero", "invalid/infin", "empty"
    };
    int phyreg = (top + i) & 0x07;
    struct _libc_fpreg* r = &(fp -> _st [phyreg]);
    const char* regExp = (((r->exponent & 0x8000) != 0) ? "-" : "+");
    printf ("  FP %s: Mantissa= %s",
            (char) ('0' + phyreg), // reg stack (SIGSEGV here)
            regExp); // register exponent sign
    j = (r->significand[3] >> 15) & 0x01;
    printf ("%s.",(char) ('0' + j)); // mantissa (Also SIGSEGV here when
                                     // previous SIGSEGV is commented out)
    ...
}

Non è il calcolo del (char)('0' + phyreg) che è il problema, perché quando mi muovo in una riga separata e memorizzare il risultato in una variabile temporanea, non ottengo il segfault fino a quando il printf cerca di visualizzare la variabile temporanea. Allora, dov'è il bug che causa il segfault?

È stato utile?

Soluzione

Si sta stampando con% s. Dovrebbe essere "FP% c: Mantissa =% s".

Altri suggerimenti

% s significa una stringa, si sta dando un carattere. Questo valore personaggio è interpretato da printf come un puntatore al primo carattere della stringa da stampare, che ovviamente non riuscire horibbly.

Mettere il carattere in un array di caratteri con 2 elementi, il secondo essere '\ 0', o vedere se printf ha qualcosa che restituisce un carattere.

Utilizza il %c di formato per un singolo carattere, invece di %s (che deve essere utilizzato per una stringa null-terminato).

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