Programming/Java2010/02/17 23:21

<대부분의 문제 발생 원인 (리스트는 우선 순위 아님)>

 

1. 해당 Application이 사용하는 Native Code 사용시 발생

 

2. 모든 Type 2 JDBC Driver는 native DBMS Library를 사용하므로 이러한 유형의 오류가 발생할 수 있습니다. 이 Driver가 문제의 원인인지 판별하려면 pure java(Type 4) JDBC Driver로 전환합니다.

 

3. JNI 호출을 사용하여 Access하는 모든 native Library도 이러한 유형의 오류가 발생할 수 있습니다. 응용 Program에서 이러한 Library를 사용하는 경우 신중하게 조사해야 합니다. 보통 이러한 Library는 응용 Program에서 해당 기능을 필요로 하기 때문에 제외시키기 어렵습니다.

 

4. JVM 자체도 native Program이며 이러한 오류가 발생할 수 있습니다. JVM이 의심스러운 경우 인증된 다른 JVM 또는 상위 Version을 사용하여 JVM Bug가 오류의 원인인지 파악합니다. 많은 JVM Bug는 JIT Compiler 사용과 관련이 있으며 종종 이 기능을 해제하면 이러한 유형의 문제가 해결되기도 합니다. 이 기능을 해제하려면 대개 -Djava.compiler=none 명령 Option을 사용합니다. 위와 같은 원인 이외에도 발생 원인은 많습니다. Core file이 생성되면 이 Core file을 분석하여 발생 원인의 범위를 좁혀 가야 합니다. (발생원인을 좁혀가는 것이지 발생원인을 정확히 집어내기는 어렵습니다. 능력이 출중한 사람은 되겠지요.)

 

이 문서에서는 Core file 분석 Tool인 dbx나 gdb을 사용하지 않고 각 OS에서 제공하는 Core File 분석 Tool을 사용 하여 분석하는 방법에 관하여 알아봅니다.

 

※ 참고 : 다음과 같은 경우 Core File이 생성되지 않을 수도 있습니다.

 

- System 또는 사용자 별 ulimit –c (Core File의 설정된 크기)를 검사합니다.

- 사용 가능한 사용자 Disk 공간을 검사합니다 (예: Disk 할당량이 있습니까?)

- Solaris에서는 ‘/etc/system’ File에 다음 매개변수가 있는데 이 값에 따라 Core File이 생성되지 않을 수 있습니다.

   : set sys:coredumpsize=0

- Linux에서는 기본적으로 Coder Dump가 Off로 있습니다. RedHat Advanced Server 2.1에서는 구성 정보 파일이 /etc/security에 있습니다. limits.conf라는 파일에서 설정 사항을 확인할 수 있습니다. "core"라는 단어를 찾아보십시오. 0으로 설정되어 있으면 coredump를 만들 수 없습니다.

-  HP OS 설정 Kernel Parameter 인 maxdsiz(max_per_proc_data_size는 사용자 Process의 Data Segment 크기를 늘림) 64M에서 134M 이상으로 변경합니다.

 

<Core File 분석 Tool>

 

다음은 각 OS에서 사용하는 분석 Tool 입니다. 분석을 위해서는 stack 분석 Tool과 map 분석 Tool을 사용합니다.

 

1. Solaris

- stack 명령 = pstack

- map 명령 = pmap

 

2. IBM AIX 5.2 이상 (이전 Version에서는 사용할 수 없음)

- stack 명령 = procstack

- map 명령 = procmap (참고문서)

 

3. Linux

- stack = lsstack (링크1에서 lsstack을 가져와서 Linux Platform에서 Build 할 수 있습니다.)

- map = pmap (이 명령은 Solaris의 pstack에 해당합니다. (링크2에서 pmap Source를 가져와서 Linux Platform에서 Build 할 수 있습니다.)

 

4. HP-UX : 기본 제공 Tool은 없으며, GDB, ADB를 사용함.

 

<명령어 사용>

 

각 명령어의 보다 자세한 Option 사항은 명령어의 Help를 참조 하십시오.

 

[예제] Solaris

 

/usr/bin/pstack [-F] [pid | core] > [분석내용저장파일명]

ex) pstack core2004-10-29 > coreStack.txt

 

/usr/bin/pmap [ -rslF ] [ pid | core ] > [분석내용저장파일명]

ex) pmap core2004-10-29 > coreMap.txt

 

[분석] coreStack.txt 내용

 

 

굵은 부분이 오류가 발생한 부분을 나타낸다. --- called from signal handler with signal’을 찾으면 된다. 이 오류가 발생한 Memory 영역이 ‘e9f90420’ 이다. coreMap.txt 파일에서 이 주소 값이 포함되는 범위를 찾아본다.

 

[분석] coreMap.txt 내용

 

 

e9f90420’가 포함된 범위에서 사용되는 Library는 ‘libhello.so’ 임을 알 수 있습니다. Core 발생은 주 원인은 libhello.so 일 가능성으로 추측할 수 있습니다.

저작자 표시 비영리 변경 금지
Creative Commons License

'Programming > Java' 카테고리의 다른 글

Java VM Core Dump 분석  (0) 2010/02/17
How to deploy EJB component  (0) 2007/10/11
EJB(Enterprise Java Beans)  (0) 2007/09/28
Posted by BLUEDAY™