在macOS上使用DTrace分析Java应用程序

str*_*t54 7 java macos profiler dtrace

我试图在macOS Sierra 10.12上使用DTrace配置Java应用程序.我正在使用JDK8:

?> ~ 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
Run Code Online (Sandbox Code Playgroud)

我的最终目标是跟踪特定包的所有Java方法条目和出口.

HotSpot VMMac OS X端口中的DTrace探测器使用HotSpot DTrace探测器似乎表明,事实上这应该在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
…
Run Code Online (Sandbox Code Playgroud)

提供了路径libjvm.dylibdtrace命令似乎并没有帮助:

?> ~ 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
Run Code Online (Sandbox Code Playgroud)

那我错过了什么?如何使用DTrace工具分析Java应用程序?

str*_*t54 6

好吧,我太快速地将系统完整性保护作为可能的原因.

csrutil enable --without dtrace恢复操作系统中执行后(在启动过程中按⌘R),hotspot探针现在只显示:

?> ~ sudo dtrace -ln 'hotspot*:::' | wc -l
    1039
Run Code Online (Sandbox Code Playgroud)