有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

macos OS OS X下的DTRUS在跟踪java时是否提供一致的结果?

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

更进一步,我将它缩小到我能想到的最简单的情况,使用Java HelloWorld,它使用系统编写代码。出来println:

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$ 

当运行DTRUS时,应用程序的行为不同——或者我在使用DTRUS/捕获DTRUS输出的方式上犯了错误

我使用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在所有情况下(例如Java)都能可靠地在OS X上获取系统调用跟踪吗

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

编辑:

OSX10.9 Java(TM)SE运行时环境(build 1.7.0_51-b13) Java HotSpot(TM)64位服务器虚拟机(构建24.51-b03,混合模式)

编辑2:

在根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) 个答案

  1. # 1 楼答案

    (如果我能找到一个“直击”选项,我会划掉我原来的全部答案,所以我将替换它。)

    解决您看到的问题的一种方法是启动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>