在跟踪java时,OS X下的dtruss会给出一致的结果吗?

时间:2014-02-25 22:58:36

标签: java macos osx-mavericks dtrace

我是OS X的新手,来自更加面向Linux的背景。 我遇到了java应用程序的问题,所以决定抓住系统调用跟踪来查看它正在做什么。当对应用程序使用dtruss时,我的行为不一致。

更进一步,然后我将其缩小到我能想到的最简单的情况,使用使用System.out.println编写的Java HelloWorld:

bash-3.2$ sudo java HelloWorldApp 2>/dev/null
Hello World!
bash-3.2$ sudo dtruss -f java HelloWorldApp 2>dtruss.out 
bash-3.2$ 

应用程序在通过dtruss运行时表现不同 - 或者我在使用dtruss /从dtruss捕获输出的方式出错。

我尝试使用OpenJDK 7在Linux机器上进行另一次快速测试,其行为与我预期的一样:

vagrant@precise64:~$ sudo java HelloWorldApp 2>/dev/null  
Hello World!
vagrant@precise64:~$ sudo strace -f java HelloWorldApp 2>strace.out
Hello World!
vagrant@precise64:~$

在所有情况下,在OS X上抓取系统调用跟踪都是可靠的,例如:对于Java?

上面的dtruss命令+输出捕获中是否存在明显的错误?

编辑:

OS X 10.9 Java(TM)SE运行时环境(版本1.7.0_51-b13) Java HotSpot(TM)64位服务器VM(内置24.51-b03,混合模式)

编辑2:

在root shell而不是sudo中运行会产生相同的结果:

bash-3.2# java HelloWorldApp 2>/dev/null
Hello World!
bash-3.2# dtruss -f java HelloWorldApp 2>dtrace.out
bash-3.2# 

1 个答案:

答案 0 :(得分:2)

(如果我能找到“罢工”选项,我会把我原来的答案全部删掉,所以我要替换它。)

您遇到的问题的解决方法是启动java进程并在启动后附加dtruss。在根shell中,键入

# dtrace -qwn 'proc:::exec-success /execname=="java"/{trace(pid);stop();exit(0)}'

在其他地方(与任何用户一样),运行您的流程:

$ java HelloWorld

[1]+  Stopped                 java HelloWorld
$

你会看到dtrace命令打印了一个pid并退出。使用

附加dtruss
# dtruss -f -p <pid> 2> dtruss.out
    PID/THRD  SYSCALL(args)          = return

现在开始java进程:

$ kill -CONT <pid>