当前位置:  开发笔记 > 运维 > 正文

使用printf时的Segfault

如何解决《使用printf时的Segfault》经验,为你挑选了1个好方法。

我正在为浮点异常的信号处理程序中调试一些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尝试显示临时变量.那么,导致段错误的错误在哪里?



1> Antti Huima..:

您正在使用%s打印.应为"FP%c:Mantissa =%s".

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有