CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): dkim (From Hell)
날 짜 (Date): 1993년11월02일(화) 01시38분13초 KST
제 목(Title): core 가지고 디버깅



해보시면 금세 어디서 에러가 났는지 알수 있을꺼에요

예를 들면 dbx a.out core 하면
그리고 그안에서 where 를 치면 어디서 에러가 났고
에러가 낫을 당시의 각각 베리어블 들의 값 등등..

gdb 도 마찬 가지고요..

여러가지 유닉스용 디버거 모두가 core 화일을
쓸수 있을 꺼에요.

그리고 SIGSEGV 라는 시그날이 날라 올때
그 디폴트 시그날 핸들러가 코어 덤프 입니다.

마찬 가지로 SIGBUS 가 날라 올때도..그렇구요.

그 SIGSEGV 는 메로리 세그먼트 바이올레이션인데
대게 엑세스 해서는 안될 메모리 주소를 사용했을때
프로텍션에 걸려 날라오는 시그날입니다.

SIGBUS 는 버스에러났을때 날라오는 시그날인데요.

가능한 몇가지 이유는 우선 하드웨어 에러 (예를 들면
타임아웃등..) 그리고 잘못된 주소에 대한
인터널 맵핑이 발견 안될때.. 그리고
프로세스의 유저 아이디로서 엑세스 해서는
안될 부분을 엑세스 하려 햇을때
I/O 트랩에 걸려서 에러가 났을때도 있지요.

근데..위의 것들 알아도 사실 별로 도움이 안되요
프로그램 디버깅할땐.. 실제로는 core 를 가지고서
디버거에 ㅤㅂㅜㅊ혀 버리는 경우가 많지요.

또 한가지 제가 자주 쓰는 트릭은

SIGSEGV 와 SIGBUS 핸들러로
함수를 한개 만들어서 여러가지 필요한 정보 프린트 하게
하고 마지막에 abort() 부르는 거지요
abort() 를 부르면 해당 프로세스에게
SIGIOT 를 보내서 코어를 덤프하게끔 해줍니다
그래서 그 코어를 가지고 디버깅 할수가 있지요.

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.