我是在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:~$dtruss是否在所有情况下都能可靠地获取OS X上的系统调用跟踪,例如Java?
上面的dtruss命令+输出捕获中有明显的错误吗?
编辑:
OS X 10.9Java(TM) SE运行时环境(build 1.7.0_51-b13) Java HotSpot(TM) 64位服务器VM (build 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# 发布于 2014-02-26 09:34:36
(如果我能找到一个“删除线”选项,我会把我原来的答案全部划掉,所以我要把它替换掉。)
您看到的问题的一种解决方法是启动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>https://stackoverflow.com/questions/22028066
复制相似问题