2.0.0-1.0 (2020年4月24日)

スタンドアロン・ユーザー・スペース実装の最初のエラータ。

これは、機能が制限されたプレリリースです。

新機能:

  • BEGINプローブとENDプローブが機能します。これらは、libdtraceのトリガー関数でuprobeを使用して実装されます。現在の実装では、これらの特殊なプローブについて文書化されたすべてのセマンティクスをまだ満たしていません。たとえば、BEGINプローブの前にプローブを報告できます。

  • exit(n)アクションが実装されました。プローブが終了し、指定された戻り値<n>をリターン・コードとして報告するdtraceになります。

  • flow-indentオプション-Fが実装されました。DTrace 1.xに存在するヒューリスティックの一部は、このバージョンでは使用できません。これらのヒューリスティックが必要かどうかを確認するために、さらにコード分析が行われています。

新規オプション:

  • -xdisasm=n: -Sオプションを指定したときに生成される逆アセンブラ・リストを指定します。<n>の値は、次のいずれかの合計です。

    • 1 =プログラムのコンパイルおよびアセンブリの後。

    • 2 =プリコンパイルされたBPF関数でのリンク(依存関係)の後。

    • 4 =最終的な再配置処理(最終プログラム)の後。

バグ修正:

  • メモリー・リークや安全でないメモリー・アクセス操作などの様々なメモリー管理の問題が修正されました。

  • D節にローカル変数を使用すると、コンパイラが、その変数に対してストアが実行される前にローカル変数のロード命令が発生した命令シーケンスを生成する可能性があります。BPF検証機能は、このようなシーケンスを拒否します。現在は初期化されていないスタックの場所からロードされないようになっています。

  • 後置インクリメント演算に対して生成されたコードにより、式の値として新しい値が使用されていました。この式の値は以前の値になっています。

  • コンパイラでのレジスタの使用に関する様々な問題が解決されました。十分な汎用レジスタを解放するために、適切なレジスタ・スピリング手法を使用するようになりました。

  • 同じ関数に対してentryプローブも存在する場合、FBT returnプローブが正しく作成されませんでした。両方が同じプローブ(最初に作成されたものに応じて、entryまたはreturnのいずれか)に接続されていました。

内部変更:

  • Cコードに様々なヘルパー関数が実装されており、GCC BPFクロス・コンパイラを使用してBPFコードにコンパイルされます。これらの関数は、DTraceコンパイラが生成する動的に生成されたコードとリンクするためのELFオブジェクトとして使用できます。DコードがBPFコードにコンパイルされると、このELFオブジェクトに対するプリコンパイルされたBPF関数への参照をすべて解決し、使用される関数(およびその依存関係)をコンパイルされたプログラムに追加します。

  • テストスイートの様々なテストでは、dtraceで-xerrtagsオプションと-xdroptagsオプションを使用して、エラー出力に特定のエラーとドロップ・タグを含めます。テストスイート・エンジンでは、これらのタグの検証が強制されませんでした。名前がerr.<tag>.*およびdrp.<tag>.*)のタグを指定するテストによって、dtraceが生成するエラー出力に指定したタグが示されているという検証がトリガーされるようになりました。

  • 動的に作成されたシステム・レベルのプローブ(kprobeおよびuprobe)は、dt_<pid>_<prv>[_<prb>]というトレースポイント・グループにグループ化されるようになりました。ここで、<pid>は、dtraceプロセスのPID、<prv>はプローブ・プロバイダの名前、<prb>はプローブ名です。_<prb>オプションの接尾辞は、FBTプローブがentryプローブとreturnプローブを区別するために使用されます。