2014-05-14 3 views
0

프로그래밍 방식으로 JDB를 조작하려고합니다. 모든 정상적인 디버거와 달리 JDB는 소스 파일 이름 대신 클래스 이름을 사용하여 소스 코드를 참조합니다. 나는 하나의 파일 대신 여러 개의 .class 파일에 바이트 코드를 저장하는 것과 관련이 있다고 가정하고있다. (컴파일시에 -g 플래그를 사용하여 소스 파일에 대한 참조를 생성 하겠지만 자바 파일은 쉽지 않다. .)JDB의 내부 클래스 및 익명 클래스의 메서드에서 중단 점 설정

JDB가 클래스를 참조 할 때 나는 보통 문자열 조작을 수행하고 소스 파일 이름을보고 어떤 클래스가 해당 클래스를 선언하는지 알아낼 수 있습니다. 중단 점에 대한 클래스 이름을 제공해야 할 때 파일을 읽고 패키지 이름을 가져오고 파일 이름을 클래스 이름으로 사용하고 그런 식으로 전체 클래스 이름을 생성 할 수 있습니다. 이 두 가지 경우 나는 그들에게 일을 시켰습니다.

이 문제는 내부 클래스와 익명 클래스로 시작됩니다. 그것들은 그들 자신의 클래스 파일에 있고, 그것들의 이름은 그것들을 포함하고있는 클래스의 맹 글링 된 버전이다. 거기에 중단 점을 설정하려면 난 맹 글링 된 이름이 필요합니다.

1: public class Main{ 
2: public static void main(String[] args){ 
3:  new Object(){ 
4:   @Override public String toString(){ 
5:    System.out.println("hi"); 
6:    return ""; 
7:   } 
8:  }.toString(); 
9: } 
10:} 

나는 그것이 javac -g Main.java을 사용하고 Main.classMain$1.class을 가지고 컴파일 -

예를 들어이 Main.java (+ 라인 번호)입니다. 나는 jdb을 실행 해요 :

Initializing jdb ... 
> stop on Main.main 
Deferring breakpoint Main.main. 
It will be set after the class is loaded. 
> run Main 
run Main 
Set uncaught java.lang.Throwable 
Set deferred uncaught java.lang.Throwable 
> 
VM Started: Set deferred breakpoint Main.main 

Breakpoint hit: "thread=main", Main.main(), line=3 bci=0 
3    new Object(){ 

(I로드 그 부분을 필요 Main.class - 그렇지 않으면 단순히 "클래스가로드 된 후이 설정됩니다을 을."모든 중단 점 시도를 설정 얻을 것입니다.)

를 나는 그것이 제대로 작동 라인 (8)에 대한 중단 점을 설정하면

: - 익명 클래스의 일부이다 -

main[1] stop at Main:8 
Set breakpoint Main:8 

내가 5 행에 대한 중단 점을 설정하면 오류가 발생합니다 :

문제는 코드가 Main.class로 컴파일되지 않는 것입니다 - -
main[1] stop at Main:5 
Unable to set breakpoint Main:5 : No code at line 5 in Main 

5 호선 명확하게 코드가 포함이 Main$1.class로 컴파일, 그래서 내가 대신 쓸 필요 :

main[1] stop at Main$1:5 
Deferring breakpoint Main$1:5. 
It will be set after the class is loaded. 

이제 방법 자바가 분할 bytecode를 .class 파일로 변환하는 것은 결정적입니다.이 간단한 예제에서는 인간의 눈으로 그것을 검사 할 때 무엇이 ​​어디로 가는지 쉽게 알아낼 수 있습니다. 그러나 실제 소스를 위해 프로그래밍 방식으로 (VimScript로) 클래스 이름을 파악할 방법이 필요합니다. 파일. 소스 파일을 구문 적으로 분석하고 어떤 작업이 너무 복잡한 지 알아 내려고 - 더 간단한 방법이되어야합니다.

은 아마 class 파일에서 정보를 추출, 또는 그것에 대해 JDB 질문, 또는

답변

0

난 그냥 같은 문제가 있었다 ... 제정신 언어에 대한 모든 제정신 디버거처럼 JDB 사용 소스 파일 이름을 확인하십시오. quickfix로서 모든 Main $ [x] .class에서 클래스 이름 (귀하의 경우에는 Object)에 대해 그냥 grepped했습니다.

많은 항목을 발견하면 소스 파일에 나타나는 순서 색인을 사용해야합니다.