2014-02-25 60 views
0

我是新的OS X開發人員,來自更加面向Linux的背景。 我有一個Java應用程序的問題,所以決定抓住一個系統調用跟蹤,看看它在做什麼。在爲應用程序使用dtruss時,我遇到了不一致的行爲。在OS X下執行操作時會在跟蹤java時給出一致的結果嗎?

再進一步,我然後把範圍縮小到最簡單的情況下,我能想到的,使用它寫入使用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中,這表現爲我本來期望另一個快速測試:

[email protected]:~$ sudo java HelloWorldApp 2>/dev/null 
Hello World! 
[email protected]:~$ sudo strace -f java HelloWorldApp 2>strace.out 
Hello World! 
[email protected]:~$ 

是dtruss可靠在所有情況下,在OS X上抓取系統調用的痕跡,例如對於Java?

在我的dtruss命令+輸出捕獲上面有一個明顯的錯誤嗎?

編輯:

OS X 10.9 的Java(TM)SE運行時環境(建立1.7.0_51-B13) 爪哇熱點(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# 

回答

2

(如果我能找到一個「罷工-THR ough」選項,我會劃掉了我的整個原來的答案,所以我代替它來代替。)

一種你所看到的問題的解決方法是啓動java過程,並在其後附加dtruss它開始。在一個root shell,類型

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

在其他地方(如任何用戶),運行過程:

$ java HelloWorld 

[1]+ Stopped     java HelloWorld 
$ 

你會看到dtrace命令已打印的PID和退出。與

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

連接dtruss現在啓動java過程:

$ kill -CONT <pid> 
+0

我給這個再試一次,這次在根shell中運行,但有類似的結果。我已將信息添加到原始帖子的編輯。 – tom

+0

對不起。上面的方法應該可以讓你得到你想要的。我不知道行爲上的差異是因爲java被跟蹤還是運行在不同的環境中。 –

相關問題