리눅스에서의 메모리 try~catch

mosad34의 이미지

현재 아무 라이브러리를 만들어 배포하는데요..10군데에서 사용하고 있다면 그중 한군데에서만 이상하게 프로그램이 죽더라고요
테스트할때는 아무문제가 없다가 상용화하면 segmentation 오류로 뻗어버려서요..ㅠㅠ
코어파일을 보면 제가 배포한 라이브러리 내에 어떤함수에서 죽더라고..
근데 그 함수는 절대 문제가 될 껀덕지가 전혀없거든요...상용화시에는 그쪽 상용프로그램에 컴파일 옵션에 디버깅정보를 넣지 하고
해서 코어파일을 봐도 죽는 위치만 나오지 왜 죽었는지에 대한 단서나 힌트를 전혀 잡지를 못해서요..
그쪽에서는 우리께 잘못됫다고 하는데 제생각으로는 라이브러리를 쓰는 상용프로그램에서도 문제가 있을 수도 있다고 보거든요..
그쪽에서 저희 라이브러리를 메모리 침범등으로해서 코어파일에는 우리쪽이 남는거 일수도 있다고..
그래서 로그를 남겨볼려고하는데 문제나는 부분을 계속해서 로그를 찍고 있을수는 없거든요..(만약 그럴시 서버에 과부하...;;;)
그래서 코어파일에 남은 죽은 위치에 try~catch와 같이 예외처리를 해서 만약 문제 발생시 로그를 남기는 걸로~
요런 형식으로 진행하려고 했습니다.
근데 이게 윈도우에서 코드작성시에는 문제 될게 없는데 리눅스에서는 그러한 메모리 예외처리를 하는걸 모르겠더라고요...자료를 찾아봐도
잘나오지 않고...
그래서 signation을 이용해 코드를 작성했지만...이건 내가 원하는 부분에만 처리되는 것이 아니고 코드전체에서 어느부분에서라도 문제발생시
시그널을 보내기때문에 이걸로 처리하기에는 않된다고 판단하였습니다..
(배포된 라이브러리가 문제가 발생하지 않고 라이브러리를 사용하는 프로그램에서 문제 발생시에도 시그널 핸들러가 호출되어 문제 발생위치를
알수없었음...)
이거때문에 한 일주일 삽질중인데..마땅한 답이 나오지 않네요..
딴데 글을올리면 컴파일옵션에 디버깅정보 남기고 코어파일 디져봐서 정보찾으라하는데...저희 프로그램이라면 당연히 그렇게 하겠죠...
근데 저희쪽에서는 라이브러리를 제공하는 형태라서요...글구 아무리 테스트를 해봐도 문제 없다가..상용화하면 수많은 사람들이 그 서버 접속시 문제가 발생...즉 상황 재연이 상당이 어렵고 힘듬..

이래저래 말이 길었는데요...
간단히 말하면 코어파일에 문제 남은 부분에 메모리 예외처리를 하고 싶습니다.(문제 발생시 어떻게든 로그를 남기기위해..)
signal함수로는 불가능합니다.
(구현해서 테스트했지만 코어파일에 남은 부분이 아닌 다른 지점에서 발생시에도 시그널이 발생으로 핸들러 함수호출됨...즉 내가 원하는 위치만 예외처리 불가ㅠㅠ)
뭔가 방법이 없을까요??메모리 오류를 넘기는건 프로그램에 문제를 주는 부분이긴하지만..그래도 일단은 로그를 남겨야 하기때문에 어쩔수가 없어서요..
고수분들...도와주세요..저에게 희망을 빛을..ㅠㅠ

obbaya의 이미지

답답한 상황이실거라 생각되서 원하시는 답은 아니지만

제가 비슷한 경험을 해봤는데요.

그 때 원인은 이름충돌이었어요.

.so 들 안에는 동일 이름이 존재할 수 있고 일반 링크시에는 충돌감지가 안되는데요.

이럴 때 엉뚱한 .so의 동일 이름 함수가 호출되서 세그폴트를 종종 내더라고요.

혹시 모르니 한번 체크해보시는 게 어떨까 해서 남깁니다.

mosad34의 이미지

아흑...그건 아니네요...신경써주셔서 감사합니다...^^;;

ymir의 이미지

http://kldp.org/node/110140#comment-510239

signal handler 에서 SIGSEGV 를 catch 해서 backtrace 를 로그로 남기는 예제입니다.

물론 main 에서 handler 를 등록해 주어야 하는데..
main 에서 handler 를 등록해주도록 어플에게 요청하거나..
라이브러리 초기화 함수가 있다면 그 안에 끼워넣는 방법도 써 볼 수 있을겁니다..

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.