문제

플로팅 포인트 예외를 위해 신호 핸들러에서 일부 Linux C 코드를 디버깅하고 있습니다. 목표는 부동 소수점 레지스터를 확인하고 정보를 인쇄 한 다음 중단하는 것입니다. 결과를 인쇄하려고 할 때 세분화 오류가 발생합니다. (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가 온도 변수를 표시하려고 할 때까지 segfault를 얻지 못하기 때문에 문제입니다. 그렇다면 Segfault를 일으키는 버그는 어디에 있습니까?

도움이 되었습니까?

해결책

당신은 %s로 인쇄하고 있습니다. "fp %c : mantissa = %s"여야합니다.

다른 팁

%s는 문자열을 의미하고 캐릭터를 제공합니다. 이 문자 값은 printf에 의해 인쇄 할 문자열의 첫 번째 문자에 대한 포인터로 해석되며 물론 실패 할 것입니다.

두 번째 요소가있는 캐릭터 배열에 캐릭터를 넣거나 두 번째는 ' 0'입니다.

사용 %c 형식 지정자 대신 단일 캐릭터의 경우 %s (a null-종결 된 문자열).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top