我正在为浮点异常的信号处理程序中调试一些Linux C代码.目标是检查浮点寄存器,打印一些信息,然后中止.尝试printf结果时出现分段错误(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) ... }
这不是问题的计算(char)('0' + phyreg)
,因为当我将它移动到一个单独的行并将结果存储在临时变量中时,我不会得到段错误,直到printf尝试显示临时变量.那么,导致段错误的错误在哪里?
您正在使用%s打印.应为"FP%c:Mantissa =%s".