printf를 사용할 때 segfault
-
23-08-2019 - |
문제
플로팅 포인트 예외를 위해 신호 핸들러에서 일부 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
-종결 된 문자열).
제휴하지 않습니다 StackOverflow