dev/java
Java Unknown Source 이유, 원인
IT's me
2021. 11. 17. 22:58
자바로 작성한 프로그렘에서 에러 발생시 트레이스 정보에는 에러가 발생한 라인수가 표시된다. 그런데 라인수가 표시되어야 할 부분에 "Unknown Source"라고 표시 되기도 하는데 이는 컴파일시에 디버깅 정보를 포함시키는 옵션을 넣지 않아서 그렇다.
javac -g *.java
ant 사용시
<javac srcdir="${src.dir}" debug="yes" destdir="${class.dir}" />
자바에서 Stack Trace 내 보통 소스 파일과 라인 번호가 있어야 할 자리에
Unknown Source가 자리할 수 있다.
다음은 이를 테스트하기 위한 코드이다.
Unknown Source 테스트 코드
public class ExceptionUnknownSourceTest {
public static void main(String[] args) {
throw new RuntimeException();
}
}
컴파일 후 실행하면 다음과 같다.
$ javac ExceptionUnknownSourceTest.java
$ java ExceptionUnknownSourceTest
Exception in thread "main" java.lang.RuntimeException
at ExceptionUnknownSourceTest.main(ExceptionUnknownSourceTest.java:3)
$
예상한대로 소스 파일과 라인 번호가 출력됨을 확인할 수 있다.
하지만 컴파일 시에 -g:none 옵션으로 디버그 정보를 제거 후 실행하면 다음과 같다.
$ javac -g:none ExceptionUnknownSourceTest.java
$ java ExceptionUnknownSourceTest
Exception in thread "main" java.lang.RuntimeException
at ExceptionUnknownSourceTest.main(Unknown Source)
$
Unknown Source가 출력됨을 확인할 수 있다.
참고로 Obfuscator를 사용하면 디버그 정보가 제거된다.
References:
http://stackoverflow.com/questions/3132302/unknown-source-in-exception-stack-trace
http://java.sun.com/docs/books/performance/1st_edition/html/JPDeployment.fm.html
http://viralpatel.net/blogs/protect-java-code-decompilation-using-java-obfuscator/