3 DTraceの使用例

次の例は、DTrace v2.0の現在の機能を示しています。例では、コマンドがrootとして実行され、/usr/sbinがPATH内にあることを前提にしています。

  • プローブを一覧表示します:

    # dtrace -l
    DTrace 2.0.0 [Pre-Release with limited functionality]
    ID   PROVIDER    MODULE                     FUNCTION NAME
    1     dtrace                                        BEGIN
    2     dtrace                                        END
    3     dtrace                                        ERROR
    4        fbt   vmlinux     trace_initcall_finish_cb entry
    5        fbt   vmlinux     trace_initcall_finish_cb return
    ...         

    この特定のシステムには、次のものが含まれています。

    • 3 dtraceプローブ

    • 87890 fbtプローブ(kprobesに基づく)

    • 1262 sdtプローブ(Linuxトレースポイントに基づく)

    • 666 syscallプローブ

  • コンパイルされたDコードをeBPFプログラムとして出力する-Sオプションと、コンパイル後に終了する-eオプションを使用するスクリプトの例:

    # dtrace -Sen 'write:entry { trace(1) }'
    DTrace 2.0.0 [Pre-Release with limited functionality]
    
    Disassembly of ::write:entry
    
    DIFO 0x46af600 returns D type (integer) (size 8) [record 16 bytes]
    INS OFF  OPCODE                  INSTRUCTION
    000 000: 62 a 0 fef8 ffffffff    stw  [%fp-264], -1     ! = EPID
    001 008: 62 a 0 fefc 00000000    stw  [%fp-260], 0
    002 016: 7a a 0 ff00 00000000    stdw [%fp-256], 0
    003 024: 7a a 0 ff08 00000000    stdw [%fp-248], 0
    004 032: 7a a 0 ff10 00000000    stdw [%f
    [...]
  • スクリプトの例:

    # dtrace -n '
    syscall::write:*
    {       
        this->x = 3;                /* clause-local variables */
        this->y = 8;
        trace(this->x * this->y);
        trace(&`max_pfn);
    }' 

    スクリプトの例の内容は次のとおりです:

    • ワイルドカードを使用して、すべてのwrite()システム・コール・プローブを同時にプローブ。

    • カーネル識別子(max_pfn)およびその他のデータ項目のアドレスを記録するプローブ。

    • 複数のプローブを単一のアクションに関連付けます。

    • 節ローカル変数が使用されます。

    • trace()アクションを使用して出力が報告されます。