2011-08-29 3 views
6

Java 스택 트레이스에 정보를 추가 할 수 있습니까?Java 스택 추적에 사용자 지정 정보 추가

저는 스크립트 언어에 대한 인터프리터를 개발 중이며 자바 스택 트레이스에서 스크립트 코드의 해당 줄을보고 싶습니다.

출력은 다음과 같은 것을 볼 수 있었다 :

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) called in script.scr:155 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) called in script.scr:130 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

나이 :

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) 
    --- called in script.scr:155 --- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) 
--- called in script.scr:130--- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

이 불행하게도이를 달성하기 아무것도 찾을 수 없습니다 구글, 많은 디버깅을 쉽게 만들 것입니다.

내가 생각할 수있는 유일한 방법은 다이내믹하게 필요한 정보가 들어 있고 단순히 스택 트레이스에서 다음 메서드를 호출하는 메서드를 사용하여 많은 클래스를 생성하는 것이었지만 (permgen) 메모리 및 CPU주기.

+0

흥미로운 질문입니다. Java 컴파일러는 파일 이름과 행 번호가있는 디버그 기호를 바이트 코드에 넣습니다. 당신이 바이트 코드를 엉망으로 만든다면, 당신의 필요에 더 잘 맞도록 조정할 수 있다고 생각합니다. JSP 컴파일러는 그런 식으로 일을합니까? – Thilo

+0

@Thilo - 예 - JSP는 바이트 코드 (때때로 중간 자바 양식 사용)로 컴파일됩니다. 일반적으로 서버의 "작업중인"디렉토리를 샅샅이 뒤져서 컴파일 된 클래스를 찾을 수 있습니다. – McDowell

+0

문제는 여러 스크립트에서 호출 되었기 때문에 내 메서드의 바이트 코드를 단순히 엉망으로 만들 수 없기 때문에 특정 정보를 추가 할 수는 없습니다. 그러나 메소드 이름이나 이와 유사한 메소드에 필요한 정보를 포함하는 클래스를 동적으로 생성 할 수는 있지만 성능에 미치는 영향에 대해 우려하고 있습니다. – ChristophK

답변

1

스크립트를 바이트 코드로 변환하는 경우 SourceFileLineNumber 속성을 사용하여 디버깅 세부 정보를 제공 할 수 있습니다.

런타임시 정보를 콜 스택에 삽입하는 메커니즘을 알지 못합니다.

+0

이 너무 나쁘면 SourceFile 및 Linenumber-Attributes에 대한 참조에 감사드립니다. 아마도 클래스를 생성해야 할 것입니다.하지만 파일 당 클래스와 라인 번호가 필요하기 때문에 수천 개의 더미 클래스가 생성됩니다. – ChristophK

+0

@ChristophK, 왜 라인 당 하나의 클래스가 필요합니까? 대신 스크립트에서 루틴/섹션별로 하나의 클래스를 사용할 수 있습니까? – jelford

+0

이 작동 할 수도 있지만, "더미 클래스"를 만드는 방법을 조금 실험했으며 심지어 수천 개의 영구적 인 생성 공간을 사용하는 것으로 보입니다. – ChristophK

관련 문제