리눅스에서 메모리 예외 처리(Segmentation Fault)

mosad34의 이미지

안녕하세요

다름이 아니고 리눅스에서 메모리 예외처리에 대해 알려주셨으면 하는데요 지금 라이브러리를 제작했는데 그걸 사용하는 프로그램에서

이유없이 Segmentaion오류로 죽더라고요..그것도 랜덤으로...
더 이상한건 그 라이브러리를 여러 다른곳에서 사용하는데 오직 한곳에 서비스하는 곳만 그렇더라고요..
그쪽에 덤프파일을 보니 저희쪽 라이브러리에서 죽긴했는데 그것도 믿을만하지가 못하더라고요..
그래서 덤프파일에 남아 있는 곳에 메모리에 대한 예외처리를 처리할려고 합니다..
그런데 여러조사끝에 signal, signation을 이용하여 예외처리가 가능할거 같아 구현하였는데..
글쎄 이게 프로세스로 들어오는 모든 시그널을 받는것인지 시그널 처리를 구현한 함수 이외에 곳에서 발생해도 시그널 핸들러 함수가
호출이 되더라고요..ㅠㅠ
따라서 내가 원하는 사용자 지정함수에만 예외처리를 할 수없다는 결론에 다달았습니다...
윈도우에서 try~catch로 메모리 오류를 처리할수 있는 방법이 없는건지여...ㅠㅠ(프로세스를 죽지 않고 진행 해야함..ㅠㅠ)

이걸로 너무 오랫동안 헤메이고 있습니다 도움의 손길을 기다립니다 고수님들 도와주세요...

참고로 시그널 처리 함수는 사용자 라이브러리에 추가해놨습니다...

(p.s 시그널 함수 처리의 영역은 한번 설정해놓으면 그 프로세스에 오는 모든 신호에 대해 호출이 되는건가요???)

Segmentation Fault발생시 프로세스가 종료되지 않고 발생한 곳에 대한 로그처리를 하고 계속 프로세스를 진행하고 싶습니다.
도와주십시요..고수분들..ㅠㅠ

제가 이래저래 조사하고 테스트를 가져봤는데 말이죠..
윈도우 환경에서 처럼 try~catch로 메모리 오류에 대한 예외처리를 하는데는 signal함수를 이용한다고 해서 그걸로 예외처리를
해보았습니다.

muzie의 이미지

질문 내용이 너무 광범위 한게 아닐까 싶습니다.

segmentation error라면
수많은 경우가 존재할 수 있습니다.

가장 기본적으로 할당되지 않은 메모리 영역에 무언가를 쓰는경우가 있겠고,
이미 해제된 메모리 영역을 또 해제하려고 한다거나
지정된 배열 공간 이후의 값에 액세스(비교, 연산등등)한다거나.. 엄청나게 많겠죠.

그리고 어떤 시그널이냐에 따라서 무시할 수도 있습니다만 메모리 에러라면
죽는게 당연하고 안전합니다.

날라오기만 하면 그냥 죽는 SIGKILL, SIGSTOP에 비해 일반적으로 SIGSEGV의 경우는 별도의 핸들러를 구현해서
죽지 않는 법이 있을지 몰라도 다시 말씀드리지만 매우 문제가 많다고 생각됩니다.

http://www.justskins.com/forums/how-to-ignore-sigsegv-signal-104217.html
시간 나시면 위의 글을 읽어보세요 :)

일단은 단일모듈별로 충분한 테스트와 검증을 거치는게 순서일듯 합니다.
여의치 않다면 -g 옵션 주고 컴파일해서 gdb 돌리세요.
수많은 쓰레드로 돈다거나 I/O가 지극히 많은 경우만 아니면 대부분 오류는 잡을 수 있으시지 않을까 합니다.

stypr의 이미지

자... 이제 backtrace 를 먼저 보고 이야기를 계속 하죠.

mosad34의 이미지

답변 감사합니다~~
좀더 공부해 봐야겟네요..ㅠㅠ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.