2012-10-31 74 views
4

任何人都可以指出我如何理解/解釋由dtruss(mac)或dtrace輸出的報告嗎?瞭解dtruss的輸出

我只是試圖在一個簡單的程序上進行研究。例如,我得到以下輸出:

PID/THRD SYSCALL(args)   = return 
250/0x103c: getattrlist("/Volumes/CORE/CORE.app\0", 0x7FFF5E8045D8, 0x7FFF5E804250)   = 0 0 
250/0x103c: geteuid(0x7FFF5E8045E0, 0x0, 0x7FFF5E804A18)  = 501 0 
250/0x103c: geteuid(0x7FFF5E805DF0, 0x0, 0x7FFF5E805E80)  = 501 0 
250/0x103c: geteuid(0x7FFF5E805540, 0x0, 0x7FFF5E805770)  = 501 0 
250/0x103c: getattrlist("/.vol/16777224/21\0", 0x7FFF5E8046D0, 0x7FFF5E803CF0)  = 0 0 
250/0x103c: geteuid(0x7FFF5E805950, 0x0, 0x7FFF5E8059C8)  = 501 0 
250/0x103c: __mac_syscall(0x7FFF8D22057C, 0x50, 0x7FFF5E805990)   = 0 0 
250/0x103c: geteuid(0x7FFF5E805950, 0x0, 0x7FFF5E8059C8)  = 501 0 
250/0x103c: __mac_syscall(0x7FFF8D22057C, 0x51, 0x7FFF5E8059A8)   = -1 Err#30 
250/0x103c: geteuid(0x7FFF5E8057D0, 0x0, 0x7FFF5E805848)  = 501 0 
250/0x103c: getattrlist("/.vol/16777224/21\0", 0x7FFF5E804960, 0x7FFF5E803F80)  = 0 0 
250/0x103c: open("/.vol/16777224/21\0", 0x0, 0x1FF)   = 6 0 
250/0x103c: geteuid(0x7FFF5E805790, 0x0, 0x7FFF5E805920)  = 501 0 

我可以看到所有這些系統調用採用十六進制參數。但我怎麼解碼這些?例如,如何找出它實際上試圖打開的文件?

+0

輸出是不機器碼狀,它是一個的執行每個系統命令的列表。查看一下linux系統命令列表(或搜索Unix/BSD/MacOS /等):http://linux.about.com/od/commands/l/blcmdl_2a.htm – newfurniturey

回答

1

dtrace是一個低級別但功能強大的工具,允許您監視許多內核級別的事件。監視或顯示的內容在dtrace腳本中指定。 這些系統調用是您正在監視的程序(而非用戶級別函數本身)調用的內核級別函數。

dtrace允許您監視/量化每個進程或進程組的CPU,磁盤,內存,文件系統,網絡等。

一個參考是Open Solaris DTrace site,但有很多基於Web的指南和操作方法。

要查看哪些文件是由進程打開你可以使用:

dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }' 
3

你的榜樣輸出並顯示路徑爲開放()系統調用(「/.vol/16777224/21」)。

dtruss是一個shell/DTrace腳本,類似於Solaris的truss工具(Linux上的strace)。這些工具的編碼是爲了理解如何以人類可讀的方式顯示參數。我在dtruss工具中編寫了其中一些代碼,但可以通過改進來了解更多。你可以創建一個dtruss的副本並定製它來添加一些,因爲它是一個shell/DTrace腳本。

對於顯示十六進制數字的系統調用,您可以先閱讀手冊頁以查看參數是什麼。例如,geteuid()沒有參數,所以dtruss的打印3的默認行爲是十六進制的,這是令人困惑的。它應該不打印,並顯示返回值。例如,這可以通過改變以下部分來完成:

/* print 0 arg output */ 
syscall::*fork:return 
/self->start/ 
{ 

到:

/* print 0 arg output */ 
syscall::*fork:return, 
syscall::geteuid:return 
/self->start/ 
{