使用printf时发生Segfault
问题描述:
我正在调试信号处理程序中的某些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的尝试显示温度我没有得到段错误变量。那么,导致段错误的错误在哪里?
答
您正在用%s打印。应该是“FP%c:尾数=%s”。
答
%s表示一个字符串,你给它一个字符。这个字符值被printf解释为指向要打印的字符串的第一个字符的指针,这当然会失败。
将字符放入包含2个元素的字符数组中,第二个字符为'\ 0',或查看printf是否具有评估为字符的内容。
杜!自从我使用printf以来已经很久了。我知道这可能是很明显的,但我只是没有看到它。 – 2009-02-13 16:54:38