2009-02-13 49 views
2

我正在調試信號處理程序中的某些Linux C代碼以處理浮點異常。目標是檢查浮點寄存器,打印一些信息,然後中止。嘗試打印(char)('0' + phyreg)的結果時,出現分段錯誤。使用printf時發生Segfault

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

這不是(char)('0' + phyreg)這就是問題所在,因爲當我將它移動到一個單獨的行,並把結果保存在一個臨時變量的計算,直到printf的嘗試顯示溫度我沒有得到段錯誤變量。那麼,導致段錯誤的錯誤在哪裏?

回答

7

您正在用%s打印。應該是「FP%c:尾數=%s」。

+0

杜!自從我使用printf以來已經很久了。我知道這可能是很明顯的,但我只是沒有看到它。 – 2009-02-13 16:54:38

3

%s表示一個字符串,你給它一個字符。這個字符值被printf解釋爲指向要打印的字符串的第一個字符的指針,這當然會失敗。

將字符放入包含2個元素的字符數組中,第二個字符爲'\ 0',或查看printf是否具有評估爲字符的內容。

3

使用%cformat specifier爲單個字符,而不是%s(其應該被用於null封端的字符串)。

相關問題