UbuntuでDTraceを使用したいのですが。
https://github.com/dtrace4linux/linux
上記のLinuxにはgithubがあります。
http://www.Oracle.com/technetwork/server-storage/solaris/dtrace-tutorial-142317.html
前もって感謝します。トレッカー
Dtrace4linuxの作者として、私に答えさせてください。
本質的に、Linux/MacOS/FreeBSD/Solarisのdtraceは同じです-私たちは皆、同じソースコードに基づいており、同じ目標を持っています。中央のメンテナがいないため、コードは実質的にフォークされ、Solarisがマスターと見なされます。主なソースコードの違いは、各プラットフォームの接着剤です。
DTraceは、いくつかのものの組み合わせです。
Syscallがかなり簡単にトレースされていることを確認してください。
$ dtrace -n syscall::open:
.....
これは、誰が実行したかに関係なく、すべてのオープンシステムコールをトラップします。 Unixを知っている場合、syscallはおおよそ次のとおりです。
open(char *filename, int flags, [int perms])
したがって、arg0は文字列「ファイル名」です。しかし、ここで状況が異なります。 C lib関数は上記と同じですが、これは次のようなシステムコールにマッピングされます。
open(int someflags, char *filename, int userflags, int perms)
したがって、ファイル名はarg0ではなくarg1にあります。 (上記が間違っている場合はお詫びします-open()
はカーネルとユーザー空間で同じだと思いますが、これは当てはまりません。たとえば、stat()
ファミリーの関数の場合)。
ここで、DTraceの「移植性」の問題が発生します。Solarisのガイドを使用してdtraceを実行し、スクリプトや例の一部を実行しようとすると、同じように機能しない場合があります。理論的には、これはLinux(私の)障害であり、dtrace4linuxを変更してこれを非表示にする必要があります。
それはすべてsyscallsに適用されます。
次に、fbtを見てみましょう。 Fbtは、関数トレース-任意の関数-任意のパラメーターを使用したものです。 open()
syscallを実装するLinux関数(sys_open
[おそらく]と呼ばれる)をトレースできます。この関数をトラップすると:
$ dtrace -n fbt::sys_open:
次に、カーネルソースコードを調べて、arg0、arg1、arg2などを確認する必要があります。そして、ほぼ間違いなくSolarisやMacOSとは異なります-Linuxの実装の詳細。
しかし、いくつかの議論にアクセスしたいかもしれません。いくつかの内部カーネルデータ構造(TCP、ディスクドライバー、USBドライバーなど)を取得します。 Solarisが提供する「プロバイダー」は、「arg3が「struct foo *」である」というよりも、データ構造にアクセスするためのより高レベルの方法です。これらのプロバイダーがなければ、スクリプトは完全にopsysに依存し、移植性はありません。ほとんどの人は、「tcp」構造がどのように見えるかを気にしませんが、pktin、pktout、rcvbytes、sndbytesなどのキーフィールドへのアクセスを望んでいます。
要約すると、dtrace4linux
およびSolaris dtrace
は、これらの機能または構造へのアクセスを可能にする移植性レイヤーを提供しますが、dtrace4linuxもSolarisも、各カーネルの数千の構造にわたる移植性を提供する完全なジョブを実行しようとしません。 。
一般に、solarisチュートリアルスクリプトを使用して、何が機能しないかを試して理解するために使用できますが、「現状のまま」使用しようとすると、何を探すべきかわからない場合にイライラします。
これらの違いを隠すには、dtrace4linuxを「悪くない」「十分でない」と見なします。 (dtrace4linuxはMacOSとほぼ同等です-Solarisチュートリアルを使用する場合、MacまたはFreeBSDで動作しないものもあります).