타입 변환 중 오류
글쓴이: indeok84 / 작성시간: 목, 2009/07/02 - 1:55오전
void aThread::converter(unsigned char *ch){ unsigned char mask = 0x0f; char val[4]; int i; val[1] = *ch&mask; val[0] = *ch>>4; for(i=0;i<2;i++){ val[i] %= 17; if( val[i]/10 ){ val[i] += 87; if(val[i] == 'f'){ str_dinfo = str_dinfo.append(" "); } } // to start from 97 else{ val[i] += 48; } // to start from 48 }val[i]=' '; val[3]='\0'; }
패킷 값 1byte씩 넘겨받아 16진수로 변환하는 함수입니다.
가끔씩
val[1] = *ch&mask;
이 부분에서 segmentation fault가 발생하더라고요;
그래서 주소값 말고 값을 복사해서 넘겨주었습니다.(물론 포인터 다 제거했습니다.)
그랬더니 이번엔 호출한 부분
converter(*packet);
에서 아래와 같은 segmentation fault가 발생하네요;;
처음 segmentation fault 도 내용은 같았습니다
스크린샷 파일 첨부했습니다.
이유 아시는 분 알려주시면 감사하겠습니다 ㅠㅠ
수고하세요!!
File attachments:
첨부 | 파일 크기 |
---|---|
crash.jpg | 30.33 KB |
Forums:
converter함수를 호출해주는 쪽에..
converter함수를 호출해주는 쪽에 문제가 있는것 같습니다. 파라메터로 넘기는 포인터 변수에 invalid한 주소값이 들어가는것으로 추정되므로, 해당 함수 호출 직전에 packet값을 확인해보세요.
--------------------------------------------------------------------------------------
조금씩이라도 전진한다.
확인해봤는데,,,
말이 안되게 길다는거 말고는 이상한점이 없는거 같네요. 그리고 대부분이 00 이라는거 말고는,,
참고로 저 함수 호출은 패킷을 잡은 후 복사 한 값에 대해 이루어 지는것입니다.
머리 아프네요;;
다시 한번
다시 한번 확인해보세요. 분명히 그부분이 이상할겁니다.
메모리 할당이 제대로 안되었다거나 해제한 메모리를 저 포인터가 가르키고 있는게 아닌지
확인해보세요. 그리고 잡은 패킷의 크기가 packet 변수가 가르키는 메모리의 길이보다 큰게
아닌지 확인해보세요.
말도 안되게 길다는 점이 발생할 수 있는 경우인지 확인해보세요. 만약에 발생이 안되어야하는
케이스라면 그것이 문제일 가능성이 높습니다. 대부분의 세그멘테이션 폴트는 할당 받지 않은
메모리를 참조하는 경우에 발생합니다. 따라서 사용하는 메모리가 할당이 되어있는 것인지
따져보시는 것이 문제 해결 방법입니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
제 무지에 제가 놀랐네요..
문제는 converter(*p) 를 수행시키는 for 루프 조건에 있었습니다.
len < header->caplen 의 조건에서 len 이 unsigned으로 선언이 되어 있었습니다. ( 도대체 언제,,, 왜,,,,,,;;;)
그래서 caplen이 255보다 크면 무한 루프를 돌았던 거구요..
정말 창피하네요 ㅠㅠ
아무튼 답변 감사합니다!!
ch로 넘어 오는 값이 null인지 채크하는 코드를 넣어 보시지요.
제가 봤을 때는 접근 할 수 없는 주소값을 *ch로 접근해서 생기는 오류 같네요.
변수 선언 후에 ch가 valid한지 확인하는 코드를 넣어 보시죠.
예를 들면
위의 코드를 사용해봤는데,,
segmentation fault 발생되기 전까지
ASSERT "ch!=0" 이렇게 나오더라고요.
즉 ch값은 항상 null이 아니었습니다...
답변 감사합니다
assert(ch!=NULL)로는 확인 안되는게 당연 한 듯
여러분들께서 거의 일관적으로 말씀하셨지만
ch의 값(ch포인터변수가 가르키는 주소값)이 엉뚱하다는 얘기지
ch == NULL 이란 얘기는 아닙니다. 프로그램이 돌다가 포인터 관련 변수에서 죽어버릴 때
포인터 변수 값이 NULL이여서 죽는 경우는 초보일 때 빼곤 흔히 볼 수 없는게 대부분입니다.
버퍼가 모자라서 덮어 써졌거나(대부분) 기타 어떤 원인이 있어 ch가 엉뚱한 곳을 포인팅 하는 것이 분명합니다.
세그멘테이션 폴트가 그렇다는 얘기니까요.
다시 한번 잘 살펴보시기 바랍니다.
감사합니다!
저 분들이 하신 말은 이해 했었는데 도저히 감이 안와서 못 잡고 있었는데
허무하게 잡아냈네요;;
답변 감사합니다!
댓글 달기