2016-10-26 5 views
1

현재 실행중인 JVM의 현재 (바이트 코드) 명령어 스트림을보고 싶습니다. 일부 googleing 후 jvm 디버그 빌드 -XX:+TraceBytecodes 옵션을 제공 발견 (here 참조). 그러나 핫스팟 JVM 디버그 빌드에 언급 된 링크가 작동하지 않아 온라인에서 디버그 빌드를 찾을 수 없습니다./자바 바이트 코드 스트림 추적

다른 방법으로 jvm 바이트 코드를 추적하거나 다른 사람이 올바른 방향으로 나를 가리킬 수 있습니까? 나는 64 비트 우분투 16.04를 실행 중이다.

P.S : 전체 명령 스트림을 인쇄하는 것이 힘들 것입니다. 그러나, 나는 골동품이다

+0

: 실시간으로 실행되는 바이트 코드 (파일 또는 콘솔) 인쇄 할? – Asoub

+0

실시간 일 필요는 없지만 그래. 그게 바로 – user1228633

+0

fastdebug 빌드를 목표로하는 것이 아니라 더 이상 게시되지 않지만 원하는 경우 직접 만들 수 있도록 소스 코드가 열려 있습니다. JDK9의 루트 저장소는 http://hg.openjdk.java.net/jdk9/jdk9/입니다. [이 readme] (http://hg.openjdk.java.net/jdk9/jdk9/raw-file/f2bdff2bd261/README-builds.html)는 시작하기 좋은 곳입니다. –

답변

6

-XX:+TraceBytecodes 옵션은 찾고자하는 것입니다. HotSpot JVM의 디버그 빌드에서 사용할 수 있습니다. JDK조차도 쉽게 HotSpot을 만들 수 있습니다. 오픈 JDK 8 프로젝트

  1. 복제 핫스팟 저장소는

    hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot 
    
  2. 빌드 'fastdebug'JVM 당신은 컴파일을 실행 HOTSPOT_BUILD_JOBS=N을 추가 할 수 있습니다

    cd hotspot/make 
    make ALT_BOOTDIR=/usr/java/jdk1.8.0_102 ARCH_DATA_MODEL=64 fastdebug 
    

    (JDK는 이미 /usr/java/jdk1.8.0_102에 설치되어있는 가정) N 병렬 프로세스.

  3. 실행 그것은 내가 이해 정말 아니에요

    export ALT_JAVA_HOME=/usr/java/jdk1.8.0_102 
    ../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass 
    
+0

슈퍼 재미있는 대답, 감사합니다! 1 단계와 2 단계는 정상입니다. 실행을 위해, 나는 명중했다 :'Error : 자바 발사기를 찾을 수 없다 "/java/re/j2se/1.8.0/promoted/latest/binaries/linux-amd64/bin/java"'. 어떤 힌트? –

+0

@MartinMonperrus 이것은'ALT_JAVA_HOME' 환경 변수가 설정되지 않았다는 것을 의미합니다. 'ALT_JAVA_HOME'을 설정하거나'build/linux/linux_amd64_compiler2/fastdebug/hotspot' 스크립트에서 직접 JDK 경로를 수정해야합니다. – apangin

+0

네 말이 맞아. 그것은 작동합니다. 고마워. –

0
can someone point me in the right direction 

글쎄, 내가 시도해 볼게. 내가 찾은 유일한 것은 jdb입니다. 자신 만의 "프린터"를 만들어야합니다.

당신이 필요 이상으로 호기심을 요구하고 있기 때문에, 나는 당신이 원하는대로 응용 프로그램을 만들 것이라고는 생각하지 않지만 어쩌면 당신은 다른 자원을 찾을 것입니다. 나는 어떤 것도 찾지 못했다) 또는 마침내 그 일을 쉽게 해준다.

jdb (java 디버거)은 JDBA (Java Platform Debugger Architecture) 및 JVM TI (Java Virtual Machine Tooling Interface)를 사용하는 CLI 프로그램입니다.

  • 당신은 -g 옵션 (필수되지 않음)하여 코드를 컴파일, jdb (보다는 java)와 메인 클래스를 시작

    jdb 작품 방법이다.
  • 당신은 콘솔에서 step 명령을 사용하여 코드의 스텝 실행에 의해 단계를 할 수 있지만, 여러 바이트 코드 지침 (소스 코드의 명령에 대응하는 모든 것들)
  • 당신은 stepi하는 경우에만이 실행을 사용할 수를 실행할 수 있습니다 하나의 바이트 코드 행.
  • 단계별 실행을 수행하려면 중단 점을 설정해야하며 cont 옵션은 IDE 에서처럼 다음 중단 점으로 이동합니다.
  • list 옵션을 사용하면 중단 점/줄 주위의 코드 (바이트 코드 제외)를 볼 수 있습니다.
  • 또한 현재 줄 번호를 소스 파일과 바이트 코드로 얻을 수 있습니다 (wherei으로 생각합니다).

다른 도구는 읽을 수있는 바이트 코드를 얻기 위해 javap -c입니다 (그러나 나는 이미 이것을 알고 있었다고 생각합니다).

이제이 모든 것들을 통해 내가 어디로 갈지 알 것입니다. jdb을 사용하여 단계별 바이트 코드 실행을 수행하는 응용 프로그램 (java 응용 프로그램 또는 일부 셸/dos)을 만들고 바이트 코드의 일치하는 행을 javac -p에서 선택하여 인쇄합니다. 다중 스레드 환경에서 어떻게해야하는지 모르겠습니다. ASM이나 dirtyJOE와 같은 바이트 코드 시각화 도구도 있지만 바이트 코드 디버깅 옵션을 제공하지는 않습니다.

저는 JVM TI가 IDE의 디버거에서 사용되며 jdb보다 더 빠르고 강력 할 수 있다고 생각합니다.당신에게 관심을 가질만한

일부 링크 :

, 나는 방법도 자바 debuging에 호기심이었다 (그리고 다른 것들) 일 했어, 그래서 이것은 다소 흥미로웠다. ng.