IT/Java

JVM Error file(crash report)

yjacket 2011. 7. 28. 18:24
자바 어플리케이션에 문제가 있어 아무 말 없이 종료되버리면 개발자 입장에선 난감하기 그지없다.
오류라도 뿜어주면 고맙겠지만, 아무도 오류메시지를 보지 못했다면 어디서 그의 죽음에 관한 정보를 얻을 수 있을것이며, 그 오류는 어떻게 찾아 고쳐야 할까?

다행히 JVM은 자바 어플리케이션에서 심각한 오류나, 예상하지 못한 오류를 발견 했을때는 자동적으로 STDOUT에 dying message 를 남기고, 어플리케이션의 실행위치에 error report 파일을 작성한다는데...

진짜 그런지 한번 보자.
아래는 강제로 에러를 발생시키는 자바 어플리케이션이다.

public class ForceDump {
public static void main( String[] args ) throws Exception
{
java.lang.reflect.Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        sun.misc.Unsafe $ = (sun.misc.Unsafe) field.get(null);
        $.putAddress(0, 0);
    }
}


이걸 실행해보면 다음과 같은 결과가 출력된다. 빨간색 글자로 범인은 누구라고 알려준다. 뿐만 아니라 어플리케이션 종료 당시의 해당 어플리케이션의 실행정보를 가지고 있는 에러파일을 저장했다고 한다.

D:\dev\lab\Test\bin>java ForceDump

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006d9b9565, pid=4568, tid=6248
#
# JRE version: 6.0_25-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V  [jvm.dll+0x1c9565]
#
# An error report file with more information is saved as:
# D:\dev\lab\Test\bin\hs_err_pid4568.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#


자세한 에러 파일 내용을 보기 전에 잠깐,

에러파일이 hs_err_pid<PID>.log 라는 이름으로 java 어플리케이션이 실행된 경로에 생겨있다. 파일이름과 생기는 위치는 이와 같은 형태가 기본값이지만, 이 파일의 이름과 위치를 바꾸려면 다음과 같이 옵션을 주면 된다.
 

D:\dev\lab\Test\bin>java -XX:ErrorFile=../err_file_pid_%p.log ForceDump
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006d9b9565, pid=3088, tid=1340
#
# JRE version: 6.0_25-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V  [jvm.dll+0x1c9565]
#
# An error report file with more information is saved as:
# ../err_file_pid_3088.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#


-XX:ErrorFile=<filename> 형식이며 filename에 %p 를 쓰면 해당 어플리케이션의 pid 값으로 치환된다.
filename 은 상대 또는 절대경로를 포함해 지정 할 수 있다. (위 예시에서는 상대경로를 지정해보았다.)
만일 유효하지 않은 경로라면 이 옵션을 지정하지 않은 것과 동일하게 동작한다.



아래는 범인에 대한 더 많은 정보를 가지고 있다는 에러파일의 내용이며, 왜 프로그램이 종료 되었는지에 대해 분석하는데 도움이 된다.


JVM 이 java 어플리케이션에서 unexpected error (e.g. out of memory error) 를 발견했을때는 에러파일내용이 아래와 같이 나오기도 한다.(헤더부분만 첨부함)


 
참조
http://www.java.com/en/download/help/error_hotspot.xml 
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#DebuggingOptions 

http://forums.oracle.com/forums/thread.jspa?threadID=1237584 (-XX:OnError 옵션을 이용해 에러파일 내용을 메일로 보내는 예제까지)