java - 无法在 Mac OS X 上通过 jinfo 启用 DTrace 探测

标签 java debugging macos dtrace jinfo

在 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 标志没有任何特殊值(value),重要的只是它们的存在与否。

但是当我尝试这样做时,我会遇到两个错误之一,这取决于我是否在它前面加上 sudo。

假设:
日元

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 );
        }
    }
}

最佳答案

您是正确的,这个探测器是可以“设置”或“取消设置”的探测器(即没有特定的“值”与之相关联)。

这几乎肯定是 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 中的一些实现细节发生了变化,使这个标志的动态设置要么不可能,要么如此它被禁用是不切实际的。换句话说,这是一个无法修复的错误。

关于java - 无法在 Mac OS X 上通过 jinfo 启用 DTrace 探测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4892893/

相关文章:

ios - 打印说明在 Xcode 6 中不起作用

linux - GCC 4.8 和 4.7 会在同一台机器上和平共存吗?

java - 在java中运行命令的问题

java - 如何在eclipse模板中插入方法注释

java - 使用 apache camel、smooks 和 flatpack

java - 试图让一个全新的 android 项目与 SlidingMenu (jfeinstein10) 和 ActionbarSherlock 一起工作

c# - 为什么在调试 Silverlight 应用程序时断点不起作用?

java - 打印数组中对象的单个元素。 java

python - 在 IPython 中使用多个断点调试 Python 脚本

MacOS 更新到 High Sierra 后 PHP 不工作