2016-10-25 10 views
5

macOS Sierra 10.12에서 DTrace를 사용하여 Java 응용 프로그램의 프로파일을 작성하려고합니다. JDK8을 사용 중입니다 :macOS에서 DTrace로 Java 응용 프로그램 프로파일 링

⋊> ~ java -version 
java version "1.8.0_102" 
Java(TM) SE Runtime Environment (build 1.8.0_102-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) 

⋊> ~ echo $JAVA_HOME 
/Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home 

궁극적 인 목표는 모든 Java 메소드 항목을 추적하고 특정 패키지를 종료하는 것입니다.

DTrace Probes in HotSpot VMMac OS X Port Using HotSpot DTrace Probes은 실제로 macOS에서 지원되어야한다고 제안하는 것 같습니다. 그러나, 내 Java 응용 프로그램이 실행 중일 때, 아무 hotspot 프로브는 사용할 수 없습니다 및 jstack()는 실패 나타납니다 도움하지 않는 것

⋊> ~ pgrep java 
24564 

⋊> ~ sudo dtrace -ln 'hotspot*:::' 
dtrace: system integrity protection is on, some features will not be available 

    ID PROVIDER   MODULE       FUNCTION NAME 
dtrace: failed to match hotspot*:::: No probe matches description 

⋊> ~ sudo dtrace -n 'syscall::read:entry /execname == "java"/ { jstack(); }' 
dtrace: system integrity protection is on, some features will not be available 

dtrace: description 'syscall::read:entry ' matched 1 probe 
dtrace: error on enabled probe ID 1 (ID 153: syscall::read:entry): invalid address (0xe2e3275e) in action #1 
dtrace: error on enabled probe ID 1 (ID 153: syscall::read:entry): invalid address (0xe2e3275e) in action #1 
dtrace: error on enabled probe ID 1 (ID 153: syscall::read:entry): invalid address (0xe2e3275e) in action #1 
… 

dtrace 명령에 libjvm.dylib의 경로를 제공 :

⋊> ~ ll "$JAVA_HOME/jre/lib/server/" 
total 31616 
-rw-rw-r-- 1 root wheel 1.4K Jun 22 15:02 Xusage.txt 
-rwxrwxr-x 1 root wheel 15K Jun 22 15:01 libjsig.dylib 
-rwxrwxr-x 1 root wheel 15M Jun 22 15:02 libjvm.dylib 

⋊> ~ sudo dtrace -L "$JAVA_HOME/jre/lib/server/" -ln 'hotspot*:::' 
dtrace: system integrity protection is on, some features will not be available 

    ID PROVIDER   MODULE       FUNCTION NAME 
dtrace: failed to match hotspot*:::: No probe matches description 

그래서 나는 무엇을 놓치고 있습니까? DTrace 기능을 사용하여 Java 애플리케이션을 프로파일 링하는 방법은 무엇입니까?

답변

5

글쎄, 나는 너무 빨리 시스템 무결성 보호를 가능한 원인으로 할인했다.

hotspot 프로브 (부팅시 보도 ⌘R)를 복구 OS에 csrutil enable --without dtrace을 실행 한 후 지금은 그냥 보여

⋊> ~ sudo dtrace -ln 'hotspot*:::' | wc -l 
    1039