Frage

Ich bin Debuggen einig Linux-C-Code in einem Signal-Handler für Punkt Ausnahmen schweben. Das Ziel ist es, das Floating-Point-Register zu überprüfen, einige Informationen drucken, und dann abbrechen. Ich erhalte einen Segmentation Fault bei dem Versuch, das Ergebnis der (char)('0' + phyreg) printf.

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)
    ...
}

Es ist nicht die Berechnung der (char)('0' + phyreg) das ist das Problem, denn wenn ich es in eine separaten Zeile zu bewegen und das Ergebnis in einer temporären Variablen speichern, ich habe nicht die segfault erhalten, bis die printf die temporäre Variable anzuzeigen versucht. Also, wo ist der Fehler, der die segfault verursacht?

War es hilfreich?

Lösung

Sie drucken mit% s. Sollte "FP% c: Mantissa =% s".

Andere Tipps

% s bedeutet eine Zeichenfolge, können Sie ihm ein Zeichen geben. Dieser Zeichenwert von printf als Zeiger auf das erste Zeichen des Strings interpretiert wird, zu drucken, das natürlich fehl horibbly.

Setzen Sie das Zeichen in einen Zeichen-Array mit 2 Elementen, das zweite Wesen ‚\ 0‘ ist, oder ob printf hat etwas, das zu einem Zeichen auswertet.

Mit dem %c Formatspezifizierer für ein einzelnes Zeichen, statt %s (die sollte für ein null terminierten String verwendet werden).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top