malloc에 의한 무한루프

Coumputer's/Linux 2009. 3. 31. 18:02



이번에 개발하면서 생겼던 문제를 해결했던 것을 정리합니다.

1. 발생 현상.
   다음 예제와 같이 malloc_consolidate () 함수에서 무한 루프 상태임.
   이와 비슷하게 다른 thread들, 즉 free를 하는 thread는 sigsuspend상태로 남아있음.

  예제)
#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

2. 발생원인 분석.
   malloc관련 원인으로 판단하여 malloc manpage에 나와있는 환경변수를 이용하여
   원인을 찾음.

 malloc manpage참조.
               " Linux libc (5.4.23 이후)의 최근 버전과 GNU libc (2.x) 버전
                 은   환경 변수를 통해조정할수 있는 malloc 수행을 포함한다.
                 MALLOC_CHECK_ 이 설정되었다면, 특별한(덜 효율적이지만)  행
                 동이 행해지며, 이것은 같은 인자를 가지고 free() 를 두번 호
                 출하거나 단일 바이트(off-by-one 버그)의 초과 같은 간 단 한
                 에러에 대한안전을 위해 디자인되었다.  그러나 그런 에러들은
                 항상 보호되지는 않으며 메모리 릭이 생길수 있다.  만일 MAL-
                 LOC_CHECK_  을 0 으로 설정하면, 발견된 힙 오염은 무시된다;
                 만일 1 로 설정하면, 진단은 stderr로 출력된다; 만일 2 로 설
                 정 하면, abort() 가 즉시 호출된다. 이것은 유용하다. 왜냐하
                 면 크래쉬가 나중에 생길것이고문제의 원인을 찾아가는것이 매
                 우 어려워지기 때문이다. "

3. 해결.
   1) "export MALLOC_CHECK_ = 1"을 setting후 엔진 동작시 "invalid free"메시지를 확인함.
   2) "export MALLOC_CHECK_ = 2"를 setting시 잘못된 메모리 free시 SIGABRT발생(manpage에는 abort()를 실행한다고 나옴).
        core로 위치 파악을 할 수 있음을 참고하여 엔진에 SIGABRT의 핸들러 등록을 주석처리함.
   3) core발생으로 위치 파악하여 원인 해결함.

PS : 위 문제는 UTM엔진에서 발생한 문제를 해결했던 절차입니다.
  상황에 따라 유동적으로 대처하시면 될 것같습니다.

jfreechart에서 한글 문제 해결.

Coumputer's/Java 2008. 7. 1. 09:54


JRE에 한글 font가 설치 되어있지 않아서 발생하는 문제

JAVA_HOME/jre/lib 폴더에 보면 fontconfig 파일들이 존재한다.
이중 fontconfig.RedHat.properties.src 파일을 fontconfig.properties파일로 복사
fontconfig.properties파일에 쓰기 권한을 주고 편집

#> cp fontconfig.RedHat.properties.src fontconfig.properties
#> chmod +w fontconfig.properties
#> vi fontconfig.properties
--------------- font.config.properties 내용 --------------------------
# 생략
.
.
.
# AWT X11 font paths
awtfontpath.chinese-tw-iso10646=/usr/share/fonts/zh_TW/TrueType
awtfontpath.chinese-cn-iso10646=/usr/share/fonts/zh_CN/TrueType
awtfontpath.japanese-iso10646=/usr/share/fonts/ja/TrueType
awtfontpath.korean-iso10646=/usr/share/fonts/ko/TrueType      <---- 이부분을 폰트 파일의 위치로 수정

 서버에서 /usr/local/java...(java폴더명은 서버마다 틀릴수 있다.)/jre/lib/ 폴더에 있는

 fontconfig.RedHat.properties.src 열고  가장 밑에 부분에 있는 곳을 확인해본다.
........

# AWT X11 font paths
awtfontpath.chinese-tw-iso10646=/usr/share/fonts/zh_TW/TrueType
awtfontpath.chinese-cn-iso10646=/usr/share/fonts/zh_CN/TrueType
awtfontpath.japanese-iso10646=/usr/share/fonts/ja/TrueType
awtfontpath.korean-iso10646=/usr/share/fonts/ko/TrueType

/usr/share/fonts/ko/TrueType 디렉토리를 생성하고 그 디렉토리에
batang.ttc과 gulim.ttc파일을 복사해 넣는다.

tomcat을 재구동 시켜준다.