3

DTraceは印象的で強力なトレース システムであり、元々は Solaris からのものですが、FreeBSD と Mac OSX に移植されています。

DTrace は、AWK や C とは異なり、D と呼ばれる高級言語を使用します。次に例を示します。

io:::start
/pid == $1/
{
    printf("file %s offset %d size %d block %llu\n", args[2]->fi_pathname, 
        args[2]->fi_offset, args[0]->b_bcount, args[0]->b_blkno);
}

コマンド ラインを使用するsudo dtrace -q -s <name>.d <pid>と、そのプロセスから発生したすべての IO がログに記録されます。

私の質問は、DTrace スクリプトからカスタム C 関数を呼び出して、トレース中にそのトレース データで高度な操作を行うことができるかどうか、およびその方法です。

4

4 に答える 4

6

DTrace の明示性により、D でループを記述できないのと同じ理由で、このようなことを行うことができなくなります。何らかの方法、形、または形式でループを台無しにすると、システム全体がクラッシュします。D プローブが起動すると、ユーザーランドではなく KERNEL モードになります。「Linux Kernel Module Programming Guide:」から引用させてください。

したがって、カーネル モジュールを作成する必要があります。あなたは C を知っていて、プロセスとして実行する多くの通常のプログラムを作成しました。次に、実際のアクションがどこにあるのか、単一のワイルド ポインターがファイル システムを一掃し、コア ダンプが再起動を意味する場所に行きたいと考えています。 .

これが、D プローブでカウボーイをプレイしたくない理由であり、D の制限があなたにとって良い理由です。=]

于 2010-04-27T20:45:11.957 に答える
1

各プローブがパイプで起動した後、少なくとも dtrace の出力をフィルタリングできるはずです。

sudo dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }' | perl myscript.pl

myscript.pl:

#!/usr/bin/perl
ながら (<>){
$_; を出力します。
print "別のアプリケーションが起動しました。何とかしてください!";
}

于 2010-04-28T05:30:25.683 に答える
1

@Sniggerfardimungus が言及している理由により、プローブ内から任意の C を呼び出すことはできませんが、おそらく、収集されているデータに対していくつかの操作を実行したいだけです (データベースに保存する/それを使用して計算または視覚化を行う/など)、それは C から完全に可能です (および他のいくつかの言語では C のラッパーを介して)。

これを行うには、libdtrace(ヘッダーは私の Mac OS X ボックスにあります)またはnode-libdtrace/usr/include/dtrace.hなどのラッパーを使用します。基本的な考え方は、DTrace データの独自のコンシューマーを作成して (実際には、コマンド ライン ツールを置き換えて)、実行中のスクリプトから出力を受け取ることができるというものです。データを取得したら、それを使って好きなことを行うことができます。dtrace(1m)

于 2013-05-29T23:23:18.340 に答える