malloc 에서 무한루프...

hanplace의 이미지

아래 보이는 Loading() 함수는 대략 초당 10회이상 콜이 되는 함수 입니다.

단지 하는일은 어떤 데이터를 패킷으로 부터 받고 메모리를 할당하여

넣어주는 일입니다. 그런데 정해지지않은 임의적인시간(20분~7시간)

마다, 아래와 같은 일이 일어나고 무한루프에 빠져 버립니다.

보시면 알겠지만, Loading 함수가 콜되자 마자 실행되는 것은 Init_Struct()

이고 Init_Struct가 콜되자마자 실행되는것은 malloc입니다.

malloc이 NULL 을 리턴하는것도 아니고, 그렇다고 seg_fault가 나는것도

아닙니다. 저상태로 프로세스가 먹통이 되어버리는 상태가 됩니다.

도데체 어찌된일인지요..? ;; 그것도 항상이 아니고 랜덤하게 일어나니

도무지 갈피를 잡을 수가 없습니다. - -;; 혹시 이에 대해 아시는 분 계신지요?

검색해보니 비슷한 질문들은 있는데 확실한 답변은 하나도 없었습니다...

#0 0x40152627 in malloc_consolidate () from /lib/libc.so.6
#1 0x40151c27 in _int_malloc () from /lib/libc.so.6
#2 0x40150e21 in malloc () from /lib/libc.so.6
#3 0x0804e39b in Init_Struct () at pcinfo.c34
#4 0x0806232b in Loading () at login.c638

mrchu의 이미지

음 저도 잘 모르는 내용이지만, 뉴스그룹에서 검색한 다음 내용이 혹시 도움이 되실까 해서 올립니다. malloc용 디버거가 있는 모양이군요.

A malloc debugger would probably be helpful. Personally I have had great success with dmalloc (http//dmalloc.com), which has saved me many times, and net-snmp is prepared for it (./configure --with-dmalloc) so that dmalloc.h is included at a proper place in all source files.

아니면 이것도 유명한 것 같더군요.
http//developer.kde.org/~sewardj/

뉴스그룹을 검색해보았더니 LibC가 정확한 포인트에서 링크 되었는지 검사해 보라고 하더군요, LibC를 사용하여 작성한 모든 프로그램이나 라이브러리가 LibC를 올바르게 링크 하였는지, 그렇지 않으면 LibC의 초기화 루틴이 불러지지 않는 문제때문에 포인터 문제가 발생할 수도 있다고 하더군요.
그런데 몇시간 마다 발생하신다고 하니, 이 문제는 아닐 수도 있겠군요.

랜덤 버그라, 참으로 개발자를 미치게 하는 버그지요.

hanplace의 이미지

mrchu님 감사합니다.
한번 알아보도록하겠습니다.
지금 상용중인 온라인게임으로서..
예전에 없던 버그가 갑자기 생긴것이니..
커널이나, 시스템의 문제일 가능성도 배재할 수는
없을것 같습니다만.. ㅠ.ㅠ 아무래도 그것은 아닐것
같습니다.

김성진의 이미지

메모리 관련 operation을 1초에 10회이상 호출하는 것은
썩 좋은 방법은 아닌 것 같습니다.

제 경험에도 AIX 의 경우 busy한 malloc호출은 프로세스를 비정상종료
시키는 경우를 보았고, 어쨌든 시스템 콜을 유발할 가능성이
높기 때문에 이런 상태를 피해야 할 것 같습니다.
(내부적으로 latch가 동작하기 때문에 contention 비용도 커집니다)

일반적으로 robust한 메모리 할당/해제를 위해서는
자체적으로 메모리 관리자(일반적으로 fixed chunk)를
만들어서 쓰는 게 보통이고,
굳이 posix형태의 메모리 할당 해제를 사용해야 한다는
제한이 존재한다면,
이와 유사한 라이브러리를 찾아서 wrapping하시는게
좋을 것 같습니다.

메모리 관련해서는 라이브러리를 절대로 믿지 마십시요.

저의 경험입니다. ^^

김성진 드림

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

댓글 달기

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