2.0.0-1.2 (2020年8月6日)

スタンドアロンのユーザー・スペース実装の2番目のエラータ。

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

新機能:

  • プロファイル・プロバイダが実装されました。デフォルトの起動率およびユーザーが指定した率/間隔のプローブでは、profile-nプローブとtick-nプローブの両方がサポートされています。

  • trace()アクションが、引数のデータ型(符号付きと符号なし、および幅)に基づいてより一貫性のある出力を提供するように更新されました。

  • printf()アクションが数値に対して実装されました。

  • raise()アクションが実装されました。

  • 1つ以上のプローブ指定で節を指定でき、各プローブ指定にワイルドカードを含めることができるようになりました。

  • ワイルドカード・プローブ指定に基づくプローブの一覧表示が実装されました。

  • 複数の節に同じプローブを指定できるようになりました。

  • 様々な組込み変数arg0からarg9 (引数を提供するプローブの場合)、curcpu curthread、epid、gid、pid、tid、uid、timestampを使用できます。

  • 予想されるテスト結果が、機能の増加を反映するために継続的に更新されます。

  • BPFがより高い制限に依存するため、ロックメモリー制限が小さすぎる場合は自動的に増加されます。

バグ修正:

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

  • 述語処理のレジスタ割当てリークが修正されました。

  • timestamp組込み変数は、特定の節内で使用されるたびに同じ値を生成する必要があります。キャッシュされた値は、次の節の実行にリークできません。

  • [Ctrl]+[C]を使用してdtraceを中断したり、シグナルを送信すると、uprobeやkprobeが残ることがあります。適切なクリーン・アップを提供できるように、割込みハンドラが十分早期に設定されるようになりました。

  • INT32_MAXとUINT32_MAXの間の整数値が正しく処理されない場合がありました。

  • /proc/kallsymsのフォールバック・サポートでは、シンボル・サイズの不足が正しく処理されず、アドレスをカーネル・シンボルにマップできませんでした。

  • int8_tは、charが符号なしのプラットフォームでも常に符号付きになるようになりました。

内部変更:

  • 節のオプションの述語が、節の実行の開始時にインライン条件としてコンパイルされるようになりました。

  • 節の実行中に使用されたマシンの状態が、以前のリリースのスタックに割り当てられました。これは、BPFコードがカーネル・インタプリタを使用して実行された場合は機能しますが、JIT BPFエンジンが使用されるとスタックがオーバーランしました。マシンの状態が、スタック領域を解放するためにBPFマップ値に格納されるようになりました。

  • 基礎となるプローブ・メカニズムとしてのuprobeとkprobeの作成は、トレースが実際に開始するまで遅延されました。つまり、プローブを一覧表示すると(-l)、システムで使用されないuprobeやkprobeが作成されなくなります。

  • 重要な(ただし、ほとんど見えない)変更がDコンパイラおよびランタイム環境に実装されました。節のコンパイルによって、単にBPF関数が生成されるようになりました。プローブ実行が設定されている場合は、トレース・セッションの一部となるすべてのプローブが収集され、各プローブに関連付けられている節のリストが作成されます。最後にトレースが開始されると、各プローブに対してトランポリンBPFプログラムがアセンブルされます。各トランポリンBPFプログラムには、プローブに関連付けられた節のコールが含まれます。各プローブの最終プログラムがリンクされると、コンパイルされた節およびプリコンパイルされたBPFユーティリティ関数への参照が解決されます。この時点で、各プローブのBPFプログラムがカーネルにロードされ、そのプローブに接続されます。