我是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#
答案 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>