6

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

これらすべてのシステム コールが 16 進パラメータを使用していることがわかります。しかし、これらをどのようにデコードすればよいのでしょうか? たとえば、実際に開こうとしているファイルをどのように見つけることができますか?

4

2 に答える 2

8

出力例には、open() syscall (「/.vol/16777224/21」) のパス名が表示されます。

dtruss はシェル/DTrace スクリプトであり、Solaris の truss ツール (Linux の strace) に似ています。これらのツールは、人間が読める方法で引数を表示する方法を理解するようにコーディングされています。これらのいくつかは dtruss ツールでコーディングしましたが、より理解できるように改善することができます。dtruss はシェル/DTrace スクリプトであるため、dtruss のコピーを作成し、カスタマイズして追加することができます。

16 進数を表示するシステムコールの場合、man ページを読むことから始めて、引数が何であるかを確認できます。たとえば、geteuid() には引数がないため、3 を 16 進数として出力する dtruss のデフォルトの動作は混乱を招きます。何も出力せず、戻り値を表示する必要があります。たとえば、これは次のセクションを変更することで実行できます。

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

に:

 /* print 0 arg output */
 syscall::*fork:return,
 syscall::geteuid:return
 /self->start/
 {
于 2014-03-03T00:32:51.173 に答える
2

dtraceは低レベルですが、多くのカーネル レベルのイベントを監視できる強力なツールです。監視または表示する内容は、dtrace スクリプトで指定します。これらのシステム コールは、監視しているプログラムによって呼び出されるカーネル レベルの関数です (ユーザー レベルの関数自体ではありません)。

dtraceを使用すると、プロセスまたはプロセスのグループごとに、CPU、ディスク、メモリ、ファイルシステム、ネットワークなどを監視/定量化できます。

Open Solaris DTrace サイトが 1 つの参考資料ですが、Web ベースのガイドやハウツーが多数あります。

使用するプロセスによってどのファイルが開かれているかを確認するには、次のようにします。

dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
于 2013-02-11T06:42:27.140 に答える