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 VMおよびMac 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アプリケーションをプロファイルするにはどうすればよいですか?