首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OS下的dtruss在跟踪java时会给出一致的结果吗?

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

Stack Overflow用户
提问于 2014-02-26 06:58:36
回答 1查看 531关注 0票数 1

我是在OS X上进行开发的新手,来自更多面向Linux的背景。我在使用一个java应用程序时遇到了一些问题,所以我决定抓取一个系统调用跟踪来看看它在做什么。在应用程序中使用dtruss时,我得到了不一致的行为。

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

代码语言:javascript
复制
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机器上尝试了另一个快速测试,它的行为与我预期的一样:

代码语言:javascript
复制
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身份运行会产生相同的结果:

代码语言:javascript
复制
bash-3.2# java HelloWorldApp 2>/dev/null
Hello World!
bash-3.2# dtruss -f java HelloWorldApp 2>dtrace.out
bash-3.2# 
EN

回答 1

Stack Overflow用户

发布于 2014-02-26 09:34:36

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

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

代码语言:javascript
复制
# dtrace -qwn 'proc:::exec-success /execname=="java"/{trace(pid);stop();exit(0)}'

在其他地方(作为任何用户),运行您的进程:

代码语言:javascript
复制
$ java HelloWorld

[1]+  Stopped                 java HelloWorld
$

您将看到dtrace命令已经打印了一个pid并退出。将dtruss附加到

代码语言:javascript
复制
# dtruss -f -p <pid> 2> dtruss.out
    PID/THRD  SYSCALL(args)          = return

现在启动java进程:

代码语言:javascript
复制
$ kill -CONT <pid>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22028066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档