无法在 Mac OS X 上通过 jinfo 启用 DTrace 探测
Posted
技术标签:
【中文标题】无法在 Mac OS X 上通过 jinfo 启用 DTrace 探测【英文标题】:Can't Enable DTrace probes via jinfo on Mac OS X 【发布时间】:2011-02-03 23:19:04 【问题描述】:在 Snow Leopard 上运行 Java 6。
您应该能够turn on ExtendedDTraceProbes on a running Java process with the jinfo utility。即使在我的命令提示符 jinfo 谈到启用通用标志:
Usage:
jinfo [option] <pid>
(to connect to running process)
...
where <option> is one of:
-flag [+|-]<name> to enable or disable the named VM flag
据我所知,DTrace 标志没有任何特殊价值,重要的是它们的存在与否。
但是当我尝试这样做时,我会遇到两个错误之一,这取决于我是否以 sudo 开头。
假设:jps
1234 StayRunning
...
与 StayRunning 进程相同的用户:jinfo -flag +ExtendedDTraceProbes 1234
Exception in thread "main" java.io.IOException: Command failed in target VM
at sun.tools.attach.MacosxVirtualMachine.execute(MacosxVirtualMachine.java:200)
at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:195)
at sun.tools.attach.HotSpotVirtualMachine.setFlag(HotSpotVirtualMachine.java:172)
at sun.tools.jinfo.JInfo.flag(JInfo.java:111)
at sun.tools.jinfo.JInfo.main(JInfo.java:58)
以 root 身份尝试:sudo jinfo -flag +ExtendedDTraceProbes 1234
Password: (which I enter)
1234: Unable to open socket file: target process not responding or HotSpot VM not loaded
错误在第二行,当然进程还在运行。
奇怪的是,this page doesn't show the "+" option for OS X,但我自己的机器打印出了使用信息。
这是我的简单代码。它与 Eclipse 类似地失败。
StayRunning.java
class StayRunning
public static void main( String [] args ) throws Exception
long counter = 0L;
while( true )
Thread.sleep( 1000 );
counter++;
System.out.println( "tick "+counter );
【问题讨论】:
这个问题有风滚草。 :-( 很多开发人员都使用 Mac,所以我很惊讶没有其他人看到这个?或者也许你们都有同样的问题并且还在等待答案?嗯......好吧,如果你有问题,请至少评论!痛苦爱陪伴你知道的。 【参考方案1】:你说得对,这个探针可以是“设置”或“取消设置”(即没有特定的“值”与之关联)。
这几乎肯定是 Hotspot JVM 中的一个(长期存在的)错误,并不是 OSX 独有的。这是来自无法在 Windows 上通过 jinfo 设置 VM 标志的报告:
http://www.herongyang.com/Java-Tools/jstack-jinfo-Change-HotSpot-VM-Option.html
我可以提供无法通过 Linux 上的 jinfo 动态设置 ExtendedDTraceProbes 和(为了科学!)其他几个标志的第一手经验。事实上,经过几次尝试后,我无法找到一个我可以动态设置的标志。
我在 Sun/Oracle 上遇到了一个相关的错误:
http://bugs.sun.com/view_bug.do;jsessionid=24c1d7e1b0cda2ffffffff97aef6bbd818cf2?bug_id=6445836
最有趣的是,在评估部分: “jinfo -flag 是动态启用 DTrace 探测的临时解决方案。正如 Mandy 所说,这应该会消失。”
部分基于这一点,以及我自己过去对 Hotspot 文档严重过时和/或不准确的经验,我怀疑尽管 jinfo 的文档/手册页以及探针本身的文档(http://download.oracle.com/javase/6/docs/technotes/guides/vm/dtrace.html) 表明,Hotspot 中的某些实现细节已更改,以使该标志的动态设置要么不可能,要么禁用它是不切实际的。换句话说,这是一个无法修复的错误。
【讨论】:
以上是关于无法在 Mac OS X 上通过 jinfo 启用 DTrace 探测的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Mac OS X 上启动 mysql 得到 mysql.sock 连接错误
无法在 mac os x mojave 上安装 mysqlclient