리눅스에서 메모리 예외 처리(Segmentation Fault)
안녕하세요
다름이 아니고 리눅스에서 메모리 예외처리에 대해 알려주셨으면 하는데요 지금 라이브러리를 제작했는데 그걸 사용하는 프로그램에서
이유없이 Segmentaion오류로 죽더라고요..그것도 랜덤으로...
더 이상한건 그 라이브러리를 여러 다른곳에서 사용하는데 오직 한곳에 서비스하는 곳만 그렇더라고요..
그쪽에 덤프파일을 보니 저희쪽 라이브러리에서 죽긴했는데 그것도 믿을만하지가 못하더라고요..
그래서 덤프파일에 남아 있는 곳에 메모리에 대한 예외처리를 처리할려고 합니다..
그런데 여러조사끝에 signal, signation을 이용하여 예외처리가 가능할거 같아 구현하였는데..
글쎄 이게 프로세스로 들어오는 모든 시그널을 받는것인지 시그널 처리를 구현한 함수 이외에 곳에서 발생해도 시그널 핸들러 함수가
호출이 되더라고요..ㅠㅠ
따라서 내가 원하는 사용자 지정함수에만 예외처리를 할 수없다는 결론에 다달았습니다...
윈도우에서 try~catch로 메모리 오류를 처리할수 있는 방법이 없는건지여...ㅠㅠ(프로세스를 죽지 않고 진행 해야함..ㅠㅠ)
이걸로 너무 오랫동안 헤메이고 있습니다 도움의 손길을 기다립니다 고수님들 도와주세요...
참고로 시그널 처리 함수는 사용자 라이브러리에 추가해놨습니다...
(p.s 시그널 함수 처리의 영역은 한번 설정해놓으면 그 프로세스에 오는 모든 신호에 대해 호출이 되는건가요???)
Segmentation Fault발생시 프로세스가 종료되지 않고 발생한 곳에 대한 로그처리를 하고 계속 프로세스를 진행하고 싶습니다.
도와주십시요..고수분들..ㅠㅠ
제가 이래저래 조사하고 테스트를 가져봤는데 말이죠..
윈도우 환경에서 처럼 try~catch로 메모리 오류에 대한 예외처리를 하는데는 signal함수를 이용한다고 해서 그걸로 예외처리를
해보았습니다.
질문 내용이 너무
질문 내용이 너무 광범위 한게 아닐까 싶습니다.
segmentation error라면
수많은 경우가 존재할 수 있습니다.
가장 기본적으로 할당되지 않은 메모리 영역에 무언가를 쓰는경우가 있겠고,
이미 해제된 메모리 영역을 또 해제하려고 한다거나
지정된 배열 공간 이후의 값에 액세스(비교, 연산등등)한다거나.. 엄청나게 많겠죠.
그리고 어떤 시그널이냐에 따라서 무시할 수도 있습니다만 메모리 에러라면
죽는게 당연하고 안전합니다.
날라오기만 하면 그냥 죽는 SIGKILL, SIGSTOP에 비해 일반적으로 SIGSEGV의 경우는 별도의 핸들러를 구현해서
죽지 않는 법이 있을지 몰라도 다시 말씀드리지만 매우 문제가 많다고 생각됩니다.
http://www.justskins.com/forums/how-to-ignore-sigsegv-signal-104217.html
시간 나시면 위의 글을 읽어보세요 :)
일단은 단일모듈별로 충분한 테스트와 검증을 거치는게 순서일듯 합니다.
여의치 않다면 -g 옵션 주고 컴파일해서 gdb 돌리세요.
수많은 쓰레드로 돈다거나 I/O가 지극히 많은 경우만 아니면 대부분 오류는 잡을 수 있으시지 않을까 합니다.
자... 이제 backtrace 를
자... 이제 backtrace 를 먼저 보고 이야기를 계속 하죠.
답변은 감사합니다..^^
답변 감사합니다~~
좀더 공부해 봐야겟네요..ㅠㅠ
댓글 달기