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엔진에서 발생한 문제를 해결했던 절차입니다.
  상황에 따라 유동적으로 대처하시면 될 것같습니다.

command line에서 ethereal 뜨기

Coumputer's/Linux 2008. 3. 11. 15:30


shell prompt상에서
# tethereal -i eth0 -w test.pcap
위와 같은 명령어를 수행시킨다.

개수를 지정하려면
# tethereal -i eth0 -c 1000 -w a.pacp
 위와 같은 명령어를 수행시킨다.