2 変更ログ

ここで提供する変更ログでは、各リリースの主な機能および変更について説明し、既知の問題もリストします。

2.0.0-1.13.1 (2023年6月7日)

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

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

バグ修正:

  • RPMを使用してDTraceをアップグレードすると、dtprobedが正しく再起動されるようになります。

テストスイートの変更:

  • テストのタイムアウトおよびdtraceプロセスが強制終了された場合、一部のテストでは、孤立したトレース・イベントがカーネルに登録されたままになることがあります。このようなプローブは、各テストの実行後に報告され、クリーン・アップされるようになります。

2.0.0-1.13 (2023年5月26日)

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

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

新機能:

  • is-enabled USDTプローブの完全なサポート。

  • トレース・スクリプトで集計データを格納する領域がaggsizeオプション値ごとに使用可能な領域より大きい場合は、エラーが報告されます。

  • トレース・スクリプトで動的変数を格納する領域がdynvarsizeオプション値ごとに使用可能な領域より大きい場合は、エラーが報告されます。

  • 主バッファー、投機バッファー、集計、および動的変数のデータ・ドロップ・カウンタのサポート。

  • proc:::signal-clearプローブが実装されました。

  • スケジューラ・プロバイダは、限定された一連のプローブ(およびいくつかの制限付き)に対して実装されています。使用可能なプローブは、dequeue、enqueue、off-cpu、on-cpu (トリガー位置の制限)、surrender、tick、およびwakeupです。デキューおよびエンキュー(arg1)のcpuinfo引数は、システムの制限のためNULLであることに注意してください。今後のリリースでは、このプロバイダが段階的に拡張されます。

  • lockstatプロバイダが実装されました。すべてのlockstatプローブが実装されていますが、ランタイム・カーネル構成によっては、一部のプローブがすべての場合(特に、インライン化を強制されるロック操作に対して)トリガーされないことがあります。また、5.10.0より前のカーネルには、スピンロック関数でkretprobeが使用されたときにカーネル・デッドロックを引き起こす可能性のあるバグが含まれています。lockstatプロバイダは、安全のためにこのようなカーネルに対して有効になっていません。

  • 真のNULL文字列がサポートされるようになりました。

  • uregs組込み変数は、古いカーネルでもサポートされるようになりました。

  • 新しいオプション「linknommap」が、mmap()の使用に関連するelfutilsバグの回避策として追加されました。

バグ修正:

  • 誤ったヘルパー・データ・サイズを報告するためにdtprobedが発行するエラー・メッセージは、予測値と受信値を逆方向に報告していました。

  • 異なるfsネームスペースに存在するプログラムのUSDTプローブが、完全にサポートされるようになりました。

  • 複数のUSDTプローブが指定された場合、最初のプローブのみが正しく提供されます。

  • charデータ型のすべての形式を同等として適切に認識します。

  • iregsをデフォルト値(BPFレジスタの数)を超えて増やすことはできません。

  • pid 0のセグメント例外をトリガーしないように、uaddr処理が修正されました。

  • シンボリック配列サイズ指定子を使用してカーネルによって表されるトレースポイント引数のデータ型が正しく処理されるようになりました。

  • 投機にデータを格納する場合のDTraceの確立された動作は、投機バッファ・オーバーフローを引き起こすような文があると、その句の実行を中止することでした。投機にデータを格納するときにオーバーフロー・チェックを実行するコードが正しく生成されるようになりました。

  • 一部の障害は、PCに障害位置を報告していませんでした。

  • コンパイラによって生成される内部シンボルに、FBTプローブは提供されなくなりました。このようなシンボルは、いずれにせよ検証できません。

  • 複数のメモリー・リークが解決されました。

  • 連想配列からロードされた整数が、64ビットに昇格されました。

  • 動的変数の割当てに失敗すると、動的変数の削除警告を報告し、句の実行を中止します。

  • DOFパーサーのクラッシュの原因が、dtprobedで修正されました。

  • PIE以外の実行可能ファイルでのUSDTプローブが完全にサポートされるようになりました。

  • DOFを同時にdtprobedに提供する複数のプログラムによって、それらのプローブの一部が作成されない可能性があります。

  • 非常に多くのUSDTプローブ(500+)を備えた共有ライブラリおよび実行可能ファイルのサポートが改善されました。

内部変更:

  • DOF_VERSION_3が、以前のバージョンと互換性がない新しいスタイルのUSDT対応プローブ・メカニズムに追加されています。

  • ユーザー・スペース・プローブ・スキャンが、パフォーマンスの問題を解決するために修正されました。

  • 'cpuinfo' BPFマップは、CPU IDが厳密に連続していない構成をサポートできるようになりました。

  • 一部のgcc/binutilsリリースでのGCC BPFサポートでは、アトミックな追加操作を表現する方法がありませんでした。回避策として、DTraceソース・コードは独自のatomic_add()構造を提供します。

  • 連想配列とTLS変数の処理は、どちらも動的変数を使用して実装されているため、統合されています。

テストスイートの変更:

  • テストスイートでは、テストに必要なカーネル・モジュールを指定できるようになりました。

  • libctfバグ#30264がシステムに存在するかどうかを確認するテストが追加されました。libctfバグは、名前のない構造体のメンバーと0以外のオフセットで共用体のoffsetof()をブレークします。

  • 複数のプロセスをトレースする複数の同時dtraceインスタンスをテストするためのテストが追加されました。

  • tick-*プローブを実際に必要としない様々なテストが、非タイマー・ベース・プローブを使用して効率性と安定性を向上させるために修正されています。

  • 多くのdtraceオプションのテストが追加されました。

  • testsuiteでは、#!dtraceを使用してインタプリタ形式の実行可能.dファイルをサポートできるようになりました(テストの実行中にdtraceの実際のパス名が置換されます)。

既知の問題点:

  • is-enabled USDTプローブを使用し、以前のバージョンのdtraceを使用して構築されたプログラムと共有ライブラリが、is-enabledプローブが機能するように再構築する必要があります。

2.0.0-1.12 (2023年2月27日)

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

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

新機能:

  • bcopy()サブルーチンでは、その最初の引数(ソース・アドレス)をalloca()'dメモリー領域にすることが禁止されなくなりました。この制限事項は文書に記載されていますが、DTraceにおいて施行されたことがなく、実用的な理由がありません。

  • clear()およびtracemem()アクションが実装されました。

  • switchrateおよびaggrateオプションが実装されました。

  • cpcおよびprocプロバイダが実装されました。

  • copyout()およびcopyoutstr()サブルーチンが実装されました。

  • uregs[]組込み変数が実装されました。

バグ修正:

  • 最大strtabサイズが大きくなりSSIZE_MAXになりました。

  • プローブ引数の情報は、プローブごとに1回のみ取得されます。

  • alloca()'dメモリーでの文字列値の扱いが修正されました。

  • basename()dirname()strchr()strrchr()inet_ntoa()サブルーチンは、任意のアドレス・ポインタの使用を十分にサポートするように更新されました。

  • copyin()の戻り値が、scratchmem (alloca()'dメモリーへのポインタのネイティブ表現)への有効なオフセットになりました。

  • profile-*およびtick-*プローブのarg0およびarg1プローブ引数が修正されました。(arg2引数はまだ実装されていません。)

  • bcopy()に対する引数の評価順序が修正されました。

  • スカラー配列アクセスの実行時境界チェックが実装されました。

内部変更:

  • プリコンパイルされたBPF関数ライブラリを構築するための、正しいアーキテクチャ依存ASMインクルード階層の選択が修正されました。

  • 安全でない可能性がある、printfスタイルの関数のコールがいくつか修正されました。

  • dtraceのマニュアルページがセクション8 (システム管理コマンド)に移動されました。

  • libdtraceとコンシューマ・フロントエンドの間のエラー処理メカニズムが、非プローブ関連の問題に関するエラー報告が可能になるように修正されました。

  • copyinstr()サブルーチンが、一時文字列メカニズムを使用するように更新されました。

  • alloca()'dメモリーへのポインタ、およびDTrace管理対象メモリーへのポインタの追跡が改善され、それに対する明示的なテストがテストスイートに追加されました。

  • コード・ジェネレータでは、効率性のためにalloca()'dおよびDTrace管理対象メモリーへのポインタに間接的ロード命令が使用されるようになり、BPF検証機能でアクセス・チェックを実行できるようになりました。

テストスイートの変更:

  • copyin*()テストは、個別のトリガーを使用することで、より堅牢になりました。

  • 新機能の実装に対応するためと、いくつかのバグ修正のために、様々なテストがXFAILからPASSステータスに変わりました。

  • 様々なテストが改善されました。

  • 新しい様々なテストが追加されました。

既知の問題点:

  • uregs[]組込み変数は、5.15より前のカーネルではサポートされていません。

2.0.0-1.11 (2022年11月9日)

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

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

新機能:

  • args[]組込み変数が実装されました。

  • カーネル領域アドレスからのスカラーのロードをサポートします。

  • copyin()、copyinto()およびcopyinstr()サブルーチンが実装されました。

  • カーネルのロックされたメモリー制限を調整するために、-xlockmemオプションが追加されました。BPFマップまたはプログラムのロードが、ロックされたメモリー制限が低すぎる可能性があることを示して失敗した場合、この新しいオプションの使用を提案するエラー・メッセージが出力されます。

  • キー(タプル)によって索引付けされた集計のサポートが追加されました。

  • 集計変数に逆アセンブラ注釈が追加されました。

  • setopt()アクションが実装されました。現在サポートされているオプション数は制限されています。

  • pidプロバイダは、コンパイラによって生成された内部関数名を無視するように変更されました。

  • USDTプロバイダが基本的なユースケース用に実装されました。プローブ・スクリプトで(pidによって)明示的に参照される実行可能ファイルに対して、通常の有効でないプローブがサポートされています。引数マッピングとワイルドカード・プローブの指定はまだサポートされていません。

新しい依存関係:

  • USDTプロバイダのサポートは、libfuseバージョン2または3の可用性に依存します。ビルド時に、使用可能な場合、libfuse 3にプリファレンスが指定されます。ビルド・プロセスでは、makeコマンドに'libfuse2=yes'を渡すことでlibfuse 2に対する強制的なビルドをサポートしています。

アップグレード:

  • USDT実装は、常に実行されるデーモン(dtprobed)に依存します。対応するsystemd dtprobed.serviceは、非レスキュー・シナリオでは比較的早期に起動したときに自動的に起動されますが、DTraceが最初にインストールされたとき、またはデーモンが存在する前のバージョン(2.0.0-1.11より前)からアップグレードされた場合は、その時点より前にすでに実行されていたプログラム内のプローブは、そのようなプログラムが再起動されるまで、DTraceの使用可能なプローブのリストに表示されません。

バグ修正:

  • sdt-providerプローブの引数は、tracepointデータを使用して正しく設定されるようになりました。

  • dtrace:::、fbt:::return、pid:::およびsyscall:::returnプローブの引数処理がクリーン・アップされました。

  • dtraceユーティリティは、--の後に複数の引数を処理できるようになりました。

  • -xcpp、-xctfpathおよび-xverboseオプションが修正されました。

  • タイプキャストと内部整数ストレージのバグが修正されました。

  • rtld_globalのlibproc検索がglibcの変更に対して改善されました。

  • procfs.dでは、カーネルとの競合を解決するために、projid_tの名前が変更されました。

  • パーサーでは、typedefのスライスのサポートが追加されました。

  • 非DTraceポインタに関連する文字列比較が修正されました。

  • execname組込み変数の値は、DTrace以外のポインタとして正しく認識されるようになりました。

内部変更:

  • コード・ジェネレータは、ランタイム・カーネル間のBPFヘルパー関数の可用性の差異に適応できます。

  • BPFマップを初期化するためのゼロの読取り専用ブロックが統合されました。

  • タプルは、その値ではなくデータ型に基づいて、予測可能なオフセットにコンポーネント値を使用して構成されるようになりました。

  • BPFマップ内のキーを反復するBPF dt_bpf_map_next_key()ヘルパーのサポートが追加されました。

  • 集計データの複数コピー(DT_AGG_NUM_COPIES)のサポートが必要なくなり、削除されました。

  • マップのマップ(配列またはハッシュ)の作成のサポートが追加されました。内部マップの参照および更新を実行する関数も含まれています。

  • 集約データのストレージが、CPU IDによって索引付けされたBPFハッシュ・マップの配列を使用するように変更されました。その結果、各CPUの集約データは独自のBPFハッシュ・マップに格納され、他のCPUのデータに影響を与えることなく変更できます。

  • BPFプログラムのロード、マップ作成、CTF、およびdlibロードのエラー・レポートがクリーン・アップされました。

  • 一部のコードがリファクタリングされ、廃止されたコードが削除されました。

テストスイートの変更:

  • テスト・オプションで-eのサポートを追加します。

  • 失敗すると予想されるテストで、xfailメッセージが改善されました。

  • より厳格な@@nosortチェックのサポートが追加されました。

  • 「不安定な」テストの問題は、XFAILとして報告されます。

  • 何度も(過去にtick-nを使用して)起動するテストは、より堅牢です。

  • 新機能の実装に対応し、いくつかのバグ修正を考慮して、様々なテストがXFAILからPASSステータスに移動されました。

  • 様々なテストが改善されました。

既知の問題点:

  • 一部のaarch64システムでは、copyin()、copyinstr()、およびcopyinto()サブルーチンが、カーネル・レベルのBPF実装の制限により障害を報告することがあります。この問題は、特定のCPU機能に関連しているようです。

2.0.0-1.10 (2022年4月26日)

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

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

新機能:

  • trace()アクションは、配列、構造体、および共用体の値をサポートします。

  • execname組込み変数が実装されました。

  • inet_ntoa()サブルーチンが実装されました。

  • progenyof()サブルーチンが実装されました。

  • getmajor()およびgetminor()サブルーチンが実装されました。

  • mutex_owned()、mutex_owner()、mutex_type_adaptive()、mutex_type_spin()、rw_read_held()、rw_write_held()およびrw_iswriter()が実装されました。

  • alloca()およびbcopy()サブルーチンが実装されました。

  • 連想配列が実装されました。これらはグローバル変数とTLS変数の両方でサポートされています。

  • 連想配列、レジスタ・スピル、および文字列定数に対して逆アセンブラ注釈が追加されました。

  • トランスレータは、カーネル・シリーズ5.16までをサポートするように更新されました。

  • 障害は、障害が報告されるPC (プログラム・カウンタ)を報告するようになります。

バグ修正:

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

  • 同じポインタが複数回チェックされないように、NULLポインタ検証が最適化されました。

  • 3項条件でのNULLポインタ処理がサポートされるようになりました。

  • 整数へのポインタのキャストが修正されました。

  • 符号付き条件の負の値(即時)が正しく出力されるようになりました。

  • TLS変数の逆アセンブラ注釈が修正されました。

  • DIFO strtabの処理が、複数のバグを修正するために再処理されました。

内部変更:

  • strlen()サブルーチンが、bpf_probe_read_str() BPFヘルパーを使用して実装されるようになりました。

  • 文字列が、長さの接頭辞を使用して格納されなくなりました。

  • Cまたはアセンブリ・コードに実装されているBPF関数が、DTraceソース・コードに静的に一覧表示されなくなりました。これらの存在は、dlibsがロードされるときに実行時に決定されます。

  • すべてのロード時間定数が、再配置メカニズムによって処理されるようになりました。

  • 開発者は、新しい関数dt_dis_insn()を使用して、単一の命令を逆アセンブルできます。

  • 事前算術と事後算術の実装が最適化されました。

  • 即時加算命令の再配置サポートが追加されました。

  • substr()サブルーチンはレジスタ圧を低減するために最適化されました。

テストスイートの変更:

  • 新機能の実装に対応し、いくつかのバグ修正を考慮して、様々なテストがXFAILからPASSステータスに移動されました。

  • 様々なテストが改善されました。

2.0.0-1.9 (2021年12月8日)

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

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

新機能:

  • rand()サブルーチンが実装されました。

  • ftruncate()サブルーチンが実装されました。

  • basename()およびdirname()サブルーチンが実装されました。

  • スレッド・ローカル記憶域(TLS)変数が実装されました。現在、索引付けされていない変数のみがサポートされています。

  • strtok()サブルーチンが実装されました。

廃止された機能:

  • ctf_module_dumpツールが削除されました。これは今後必要ありません。

バグ修正:

  • substr()およびstrjoin()サブルーチンは、結果文字列長を文字列長の接頭辞に正しく格納するようになりました。

内部変更:

  • 開発レベルの診断を向上させるために、コード・ジェネレータの一時文字列(tstring)のサポートが改善されました。

  • 代入および三項式を正しく処理するために、一時文字列のライフサイクル処理が更新されました。

  • substr()およびstrjoin()サブルーチンが修正され、より最適化された実装が提供されるようになりました。

  • トレース出力バッファに文字列値を格納するために、より効率的なコードが新しく生成されます。

  • libdtraceで汎用のハッシュテーブル(htab)が改善されました。

テストスイートの変更:

  • libdtrace-ctfとlibctfの間のCTFエラー・メッセージの違いに対処するために、様々なテストに結果ポストプロセッサが追加されました。

既知の問題点:

  • ネストされた複雑な式によって、コード・ジェネレータの使用可能なレジスタが不足する可能性があります。これは、レジスタのライフサイクル追跡に関する既知の問題です。

2.0.0-1.8 (2021年10月15日)

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

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

新機能:

  • htonl()、htonll()、htons()、ntohl()、ntohll()およびntohs()サブルーチンが実装されました。

  • 文字列比較が実装されました。

  • strchr()、strrchr()、index()、rindex()、strstr()およびlltostr()サブルーチンが実装されました。

  • 圧縮カーネル・モジュールのシンボルを解決できるように、サポートが追加されました。

  • 投機トレースが実装されました。speculaton()サブルーチンのサポートと同様に、speculate()、commit()およびdiscard()アクションが完全にサポートされます。

  • valgrindでdtraceを実行できるようになりました。

バグ修正:

  • ロード可能モジュールのシンボル解決が破損しました。このドキュメントは修正されました。

内部変更:

  • エンディアン変換BPF命令のサポートが追加されました。

  • perf_event_open()のすべての使用でPERF_FLAG_FD_CLOEXECフラグを指定するようになりました。

既知の問題点:

  • 文字列サイズが128文字を超えると、BPF検証機能の制限により一部の文字列操作で問題が発生する可能性があります。

2.0.0-1.7 (2021年9月9日)

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

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

新機能:

  • SDTプローブに渡された引数を、arg0からarg9の組込み変数を使用して取得できるようになりました。

  • BPF検証機能ログの生成を要求する-xbpflogオプションが追加され、BPFプログラムのロードを試みた結果のsfにかかわらず表示されます。このオプションは、Dオプション・プラグマを使用して設定することもできます。

  • strjoin()サブルーチンが実装されました。

  • substr()サブルーチンが実装されました。

バグ修正:

  • トランポリン生成が修正され、コードの生成中に正しいプローブ・コンテキストが設定されるようになりました。

  • 特定のデータ型のアライメント・サイズを決定するために使用される型のアライメント処理コードは、列挙を整数として処理しており、これは正しくありませんでした。適切にアラインメントを決定し、libctfに関連する障害を回避できるようになりました。

  • BEGINプローブ実行内でのERRORプローブ呼出しの処理が修正されました。

  • トレース出力バッファ内の文字列データのサイズが、2バイトの長さの接頭辞と終了NULバイトに対応するように修正されました。

  • 値コピー操作のデータ・サイズが修正されました。このサイズは、宛先がより小さい場合でもソース・データのデータ・サイズでのみ決定されていました。2つのサイズの小さい方が使用されるようになりました。

内部変更:

  • プロバイダ実装で標準の関数を使用して、プローブ起動時のCPUレジスタの状態をクリアまたはコピーするようになりました。

  • 新しいマクロset_upper_bound()およびset_lower_bound()は、C-to-BPFソース・コードで使用できます。これらのマクロを使用して、BPF検証機能の値および範囲境界に関するヒントを提供します。

  • 事前コピーされたBPFコードでSTRSZ BPFシンボルを使用して、最大文字列サイズを表すことができるようになりました。

  • プリコンパイルされたdt_memcpy()関数は、bpf_probe_read() BPFヘルパー関数の呼出しに置き換えられました。

  • BPFアセンブラ・ソース・ファイル(.S)のオブジェクト・ファイル(.o)へのコンパイルのサポートが追加されました。この機能では、GCC BPFクロス・コンパイラが使用されます。

  • 汎用スクラッチ・メモリー領域に、そのベース・アドレスへのポインタからアクセスできるようになりました。このポインタはdctx->memにあります。この領域を使用するようにスタック・トレース実装が更新されました。このスクラッチ・メモリー領域は、文字列操作関数で使用される一時文字列領域を提供する場合にも使用されます。

  • 文字列長の接頭辞が、可変長の整数から2バイトの固定幅の整数に変更されました。これは、BPF検証機能の制限により必要になりました。これは、文字列処理コードのより永続的な修正が行われる間の暫定的な解決策です。

2.0.0-1.6 (2021年6月18日)

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

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

新機能:

  • プローブ・プログラムの実装に使用されるBPFプログラムのより大きいサイズに対応するために、命令オフセットが4桁の値として出力されます。

  • 文字列定数をD節の値として使用でき、変数が文字列値を保持できます。文字列データを保持する組込み変数を変数に代入して、式の値およびアクション引数として使用できます。

  • trace()アクションは文字列をサポートします。

  • strlen()サブルーチンが実装されました。

  • 組込み変数probeprov、probemod、probefunc、probename、caller、stackdepth、ucaller、ustackdepth、errnoおよびwalltimestampがサポートされるようになりました。

  • アクションstack()、ustack()、umod()、usym()およびuaddr()が実装されました。

バグ修正:

  • グローバル変数およびローカル変数のストレージ・サイズが必ずしも正しく設定されておらず、データが破損していました。変数が明示的に宣言されていない場合、最初に使用されるまでそのデータ型がわからない場合があります。ストレージ・サイズが、常に変数の明示的または検出されたデータ型に基づいて設定されるようになりました。

  • 組込み変数は、特定の変数ID範囲内でグローバル変数として実装されます。この値はグローバル変数記憶域に格納されないため、記憶域オフセットがありません。逆アセンブリ出力内の変数リストは、オフセットとして-1を出力していました。組込み変数のこのオフセットは出力されなくなります。

  • ERRORプローブに関連するメモリー・リークが修正されました。

  • 64ビット・データ項目の再配置が、下位32ビットに切り詰められていました。これは修正済です。

  • 集積体にデータを格納することは、データ記録アクションとみなされていました。これにより、データが実際にプローブ出力バッファに格納されない節について、コンシューマがプローブの起動を報告していました。この動作は意図したものではありませんでした。集積データ生成は、データ記録アクションではなくなりました。

内部変更:

  • グローバル変数とローカル変数が、サイズとアライメントの要件を考慮することで、より効率的に格納されるようになりました。

  • プローブ記述(id、プロバイダ名、モジュール名、関数名およびプローブ名)がprobes BPFマップに格納されるようになりました。値は、文字列定数テーブルにオフセットされます。

  • 文字列定数表は、キー0のシングルトン要素の値としてstrtab BPFマップにロードされます。

  • 文字列ハッシュ値の計算が、必要なすべてのコードから呼び出される単一の関数に統合されました。

  • 可変長整数のサポートが追加されました。これは主に、文字列の長さを文字ストリームに合わせて格納するために使用されます。

  • メモリー・コピー関数(プリコンパイル済Cコードとして実装され、BPFにコンパイル)が最適化され、さらに堅牢になりました。

テストスイートの変更:

  • 新機能の実装に対応し、いくつかのバグ修正を考慮して、様々なテストがXFAILからPASSステータスに移動されました。

  • 様々なテストが改善されました。

既知の問題点:

  • メモリー・コピーの実装の制限により、256バイトを超えるデータ型の値の代入は現在機能しません。

  • 特定の最大文字列サイズを設定するDTraceオプションはコマンドライン・ツールによって受け入れられますが、256バイトを超える設定は正しく機能しません。

  • -Zオプション(使用可能なプローブに一致しない節を許可)では、節を登録して、後でプローブが使用可能になったときに有効にすることはできません。

2.0.0-1.5.1 (2021年4月12日)

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

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

新機能:

  • pidプロバイダが実装され、ユーザー・スペース・レベル(共有ライブラリおよび実行可能ファイル内)での関数境界トレースが有効になりました。今後の開発では、ここで提供される機能をユーザー・スペース・レベルでの任意の命令トレースで補強します。

  • ERRORプローブ(dtraceプロバイダ)が実装されています。ゼロによる除算やNULLポインタの間接参照などの一部のエラー状態は、BPFプログラムの実行で致命的な障害となるため、BPFプログラムで明示的にチェックされます。

  • 正規化集積アクション(normalize()およびdenormalize())が実装されました。

  • 8バイトを超えるサイズのグローバル変数とローカル変数、および参照による変数へのアクセスのサポートが追加されました。これには、最大256バイトのサイズの構造体割当て文を許可するなどが含まれます。今後の作業では、より大きな値サイズを使用できます。

  • BPF検証機能の出力ログの最大サイズを指定する-xbpflogsize=Nオプションが追加されました。このログは、BPFプログラムをカーネルにロードできない場合に生成されます。このオプションは、Dオプション・プラグマを使用して設定することもできます。

  • -Sオプションに対する-xdisasm=Nのサポートが改善されました。使用可能な逆アセンブリのリストが更新されました。<N>の値は、次の使用可能なリストの任意の数値の合計です。

    • 1 =節の関数のコンパイルおよびアセンブリの後。

    • 2 =プローブ・プログラムを構築した後。

    • 4 =依存関係をプローブ・プログラムにリンクした後。

    • 8 =すべての処理の後、プローブ・プログラムをロードする前。

パッケージの変更点:

  • UbuntuでDTraceを構築するためのサンプル・スクリプトが追加されました。

バグ修正:

  • 様々な集積のバグ修正: 集積のリセット、書式設定されたprinta()、データのない集積を出力しない(集積ごとのラッチの使用)など。

  • ビットフィールド演算が、従来の動作(各ビットフィールドを次に大きい整数型のサイズに合わせる)を維持する方法で修正されました。

内部変更:

  • カーネル・トレースポイント・ベースのプロバイダの実装が、一貫性を高め、新しいpidプロバイダの実装のニーズに対応するように修正されました。pidプロバイダは、カーネル・プローブに1対1でマップしないプローブを公開するプロバイダを実装するためのサンプルも提供します。

  • デュアルコピー集積コードをオフにするメカニズムができました。このメカニズムは、より新しいカーネルに移行する場合に使用されると予想されます。しかし、当分は、単に過剰なBPFマップ領域を使用しているだけです。

  • eventfdメカニズムが、1つ以上のプロセスが終了したことを示すために使用される条件変数の置換として使用されます。つまり、プロセス終了通知がトレース・バッファ・データ通知とともに処理されます。dtrace_sleep()関数が非推奨となりました。

  • スタイルの一貫性を高めるためにソース・コードがリファクタリングされ、スタイル・ガイド(CODING-STYLE)が追加されました。

  • *_addおよび_del htab関数の標準実装が導入されました。

  • 生成されたBPFコードのジャンプ・ターゲットの再配置が、ラベルのないBPF_NOP命令を処理するように修正されました。

  • 3つ以上のカーネル・リリースで異なる定義を持つトランスレータを処理します。

  • プリコンパイル済BPF関数get_gvar()およびset_gvar()が削除されました。

テストスイートの変更:

  • 新しいテストが追加されたか、新しい機能のためにXFAIL注釈が更新されました。

  • プローブがないときにライブラリの依存関係が何を意味するかに関して、未定義の動作に対する依存性を排除するために、test/unittest/pragma/*libdep*テストにプローブが追加されました。

  • 集積テストが改善されています。

  • いくつかの逆アセンブリ・テストが追加されました。

既知の問題点:

  • 一部のアーキテクチャ(aarch64など)は、JITでコンパイルされたBPFプログラムのハードコーディングされたメモリー量を確保します。各プログラムまたはサブプログラムは、メモリー内の全体のページ数を占有します。カーネルが大きなページサイズ(16kまたは64k)で構成されている場合、予約されたメモリー量が、大量のプローブの同時使用をサポートするのに十分ではない可能性があります。

    予約メモリーはシステム全体であるため、同時DTraceトレース・セッションは、同じ制限されたページ・プールからメモリーを消費します。

    現在、この問題の既知の回避策はありません。

2.0.0-1.4 (2020年12月9日)

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

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

新機能:

  • 集積体が実装されました。現在のところ、@、@a、@fooなど、索引付けされていない集積体のみがサポートされています。@[1]、@a["foo"].はサポートされていません

  • すべての集積関数(avg()、count()、llquantize()、lquantize()、max()、min()、quantize()、quantize()、stddev()、sum())が実装されました。

  • 集積関数の引数チェックが改善されました。

  • 標準集積のprinta()アクションが実装されました。

バグ修正:

  • ビット単位の否定が修正されました。

  • quantize()のレポートが修正されました。最後のビンにすべての値がマップされたときにデータが報告されませんでした。

  • コンシューマがトレースを停止するようにトリガーしたときにEND節が正しく実行されるようになりました。

内部変更:

  • 集積体が(BPFマップ内の) CPUごとのカーネル・バッファにデータを累積するようになり、コンシューマは必要に応じてすべてのCPUバッファのスナップショットを取得します。つまり、コンシューマ・レベルで発生する集積体がすべてのCPUにわたる値の集積体を構成します。

  • BPFコードの手動生成をサポートするマクロが追加されました。2つのC文を取得するために使用される各BPF命令: 命令が定義され、リストに追加されました。新しいマクロを使用すると、このような行が何百も排除され、Cコードが生成しているBPFのように見えます。

  • 開発時に無効になっていたエラー・メッセージ「%s %s( )はD式からコールできない場合があります(Dプログラムのコンテキストが必要)」が復元されます。

  • 廃止されたdt_bpf_builtins.hヘッダー・ファイルを削除します。

  • dtrace_aggvarid_tをdtrace_aggid_tに置き換え、DTRACEAGG_*をDT_AGG_*に置き換えます。

コンパイルの修正:

  • 再配置がない場合でも、プリコンパイルされたBPF関数が正しくロードされるようになりました。

テストスイートの変更:

  • コメント、入力ミスおよび命名がクリーン・アップされました。

  • 新しいテストが追加されたか、新しい機能のためにXFAIL注釈が更新されました。

2.0.0-1.3 (2020年10月2日)

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

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

新機能:

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

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

  • 2つの追加組込み変数(idおよびppid)が使用可能になりました。

  • DTrace逆アセンブラの注釈が読みやすくなりました。

バグ修正:

  • BEGINおよびENDプローブのセマンティクスが、文書化された動作に一致するように修正されました。BEGINは常に最初に実行されるプローブであり、ENDは常に最後に実行されるプローブです。また、exit()アクションが、BEGINプローブとENDプローブ、およびトレース・データ・コンシューマとの相互作用の点で修正されました。

  • デフォルトのアクションと非データの生成アクションの動作が修正されました。

  • 符号付きの分割および残余演算の実装は、BPFが命令を提供しないという点で修正されました。

  • 後置デクリメント式に生成されたコードが修正されました。

  • 理論的バッファ・オーバーフロー問題のバグ修正が、1.2バージョンのDTraceに同じコードが存在するため、このバージョンからマージされました。

内部変更:

  • 型キャストが、必要に応じてシフト演算のみを実行するように最適化されました。実装も改善され、追加のレジスタを必要としません。

コンパイルの修正:

  • procfs.d Dライブラリはsched.d Dライブラリに定義されているデータ型を使用しますが、sched.dへの明示的な依存関係がありませんでした。

  • yylineno変数が2箇所で宣言され、より新しいコンパイラと競合していました。プライマリ宣言は現在dt_lex.cにあり、dt_cc.cにこの変数のextern宣言があります。

  • 分散によって、アーキテクチャに固有のインクルード・ファイルが様々な場所に配置されます。ビルド・システムは有効であるように見える最初の場所を使用して、様々な既知の場所を試みます。

  • 一部のより新しいコンパイラが、mkoffsets.shによって生成されたソース・コード内のr_debug_offsetsおよびlink_map_offsets配列のconstを受け入れません。

  • コンパイル中にトリガーされたコンパイラの警告を解決するために、ソース・コードに様々な変更が適用されました。

テストスイートの変更:

  • 1.2バージョンのDTraceから、bogus-ioctl testsuiteトリガー実行可能ファイルに対するバグ修正がマージされました。これは、このバージョンで、open()ライブラリ関数の同じ不適切な使用が発生するためです。

  • 一部のテストスイート・スクリプトが、スレッド・ローカル変数(self->n)が必要な場所でローカル変数(this->n)を使用していました。

  • 各種テストスイート・ケースは、より堅牢になるように更新されました。

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プログラムがカーネルにロードされ、そのプローブに接続されます。

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プローブを区別するために使用されます。

2.0.0 (2020年3月10日)

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

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

作業コンポーネント:

  • D言語全体(集積を除く)。有効なD節は、同等のBPFプログラムにコンパイルされます。

  • DTraceコア機能の大部分が実装されており、ほぼ完全なコンパイラ実装(述語を含む)、プロバイダAPI、プローブ管理およびLinuxトレース統合が提供されます。

  • プリコンパイルされたBPF関数ライブラリのサポートが追加されました。これは、様々なD言語構造(グローバルおよびTLS変数アクセス、文字列操作など)およびDサブルーチンの実装に使用されます。この機能では、GCCおよびbinutilsでクロス・コンパイル・ツールとしてBPFサポートを使用します。BPF関数はDTraceビルド時にコンパイルされるため、クロス・コンパイル・ツールへのランタイム依存関係はありません。

  • BPF検証機能の出力を報告するためのサポートが追加されました。コンパイルされたDスクリプトがBPFプログラムとしてカーネルにロードされると、BPF検証機能が静的なコード解析を実行して、プログラムの安全性を確保します。この分析が失敗すると、出力が生成され、DTraceによってこの出力がユーザーに報告されます。

  • カーネルがこの情報を/proc/kallsyms (または/proc/kallmodsyms)で提供する場合、関数境界トレース(FBT)は、モジュール別にグループ化された関数でプローブします(モジュールがコンパイルされているかどうか、ロード可能かどうかに関係なく)。

  • 型付きプローブ引数をサポートするシステム・コールのentryおよびreturnプローブ(systraceプロバイダ)。

  • 静的定義トレース(SDT)は、Linuxのトレースポイントに基づいてプローブします。型付きプローブ引数がサポートされます。

  • トレース・データ・バッファ管理コードが、トレース・データを記録するためにBPFで使用されるパフォーマンス・イベント・リング・バッファを使用するように修正されました。

  • DTraceテストスイートが更新され、DTrace v2の開発の現在の状態で合格することが予想されるテストが反映されました。また、様々なテストが改善され、より堅牢になり、テスト内容に重点が置かれるようになりました。

1.2.1 (2019年2月12日)

バグ修正:

  • プロセスが-cを使用して捕捉され、ustack()、usym()またはumod()、あるいはpidまたはusdtプロバイダで追跡されているときに停止した場合に、DTraceが終了に失敗する原因となるバグを修正します。

コンパイルの修正:

  • glibc 2.28でコンパイルします。これにより、makedev()が<sys/types.h>から移動します。

  • GNU Awkの最新バージョンの存在下でのテストスイートの改善。

1.2.0 (2018年12月13日)

新機能:

  • 新しいアクションpcap(struct sk_buff *、protoなど)。protoは/usr/lib64/dtrace/*/pcap.dのPCAP_*定数の1つです。tsharkがインストールされている場合は、フォーマットされたパケット・トレースが生成されます。インストールされていない場合は、tracemem()と同様にRAWメモリー・ダンプが生成されます。freopen()を使用してDTrace出力をファイルにリダイレクトすると、RAWパケットがそこに書き込まれます。

  • 4.19カーネルのトランスレータの変更(4.20preでも-6まで動作)。

バグ修正:

  • 様々な小さなメモリー・リークを修正します。

  • テストスイートの改善。

ビルド時:

  • 新しいglibcバージョンでは、signal.dの生成が改善されます。

1.1.1 (2018年10月25日)

テストスイートの変更のみ。

1.1.0 (2018年8月10日)

新機能:

  • 4.15カーネルのトランスレータが変更されます。(4.18までのカーネルでも機能。)

新規オプション:

  • -xctfpath: 実行中のカーネルで使用するCTFアーカイブの名前を指定します($(-xmodpath)/kernel/vmlinux.ctfaの下の通常の場所で見つからない場合)。

バグ修正:

  • 様々な小さいメモリー・リークや初期化されていないデータの使用に関するバグを修正します。

  • コンパイラの警告をクリーン・アップします。

ライブラリ・インタフェースの変更:

  • SystemTapの互換性のために、sdt.hにDTRACE_PROBE定義をさらに追加します。

1.0.4 (2018年8月10日)

バグ修正:

  • 自分自身をトレースしようとしたときにクラッシュしなくなりました。

  • DTraceが誤って終了したときのDTraceとトレースされたプロセスの両方のクラッシュに対するさらなる修正。

1.0.3 (2018年7月24日)

バグ修正:

  • -c/-pプロセスが間違って終了した場合のクラッシュまたはデッドロックがなくなりました。

  • -c/-pプロセスが新しいスレッドを作成する際のデッドロックがなくなりました。

  • 逆アセンブラのコアダンプを停止します。

1.0.2 (2018年5月10日)

バグ修正:

  • ARMで誤って不合格になったテストを合格としてマークします。

1.0.1 (2018年4月28日)

新機能:

  • USDTプロバイダとPIDプロバイダの両方がARM64でサポートされます。

バグ修正:

  • -cオプションが、ARM64で-x evaltimeオプションと同様に機能するようになりました。

  • テストスイートおよびテストスイート・ランナーの改善。

1.0.0 (2018年3月27日)

新しいアーキテクチャ:

  • ARM64のサポート。

新機能:

  • コンパイル時の配列境界のチェック。宣言された境界を越える配列の間接参照が、コンパイル時エラーになりました。配列を間接参照するには、((char *)curlwpsinfo->pr_name)[32]などのキャストを使用します。

  • カーネル4.12から4.14のトランスレータのサポート。

  • ユーザー・スペース・トレースの初期PIDプロバイダのサポートが追加されました。

  • デザイン変更後のビルド・システムでは、4.14.yバージョンのカーネルでトランスレータを変更できるようになりました。新しいカーネルに移植すると、新しいカーネル・バージョンをdefine_for_kernelマクロのリストに追加する必要がなくなります(変更が実際に必要でない場合)。

バグ修正:

  • アドレスはmod()によって正しく正規化されるため、集積でのmod()の使用が改善されました。

  • DTraceは、組込みモジュールまたはコア・カーネル内のシンボルが間違ったモジュールにあることを考慮しなくなります。通常、シンボルのアドレス、サイズおよび名前へのマッピングは、特に重複しているシンボル、名前が重複しているシンボルおよび弱いシンボルに関してより適切です。

  • 対象となるプロセスがustack()、umod()、usym()、dtrace -cまたは-p exec()によって捕捉された場合にDTraceコンシューマが解放されたメモリーを間接参照する可能性のあるインタフェースの問題が修正されました。これには、libdtraceの特定のユーザーを変更し、再リンクする必要があります。次の「ライブラリ・インタフェースの変更」を参照してください。

  • リトル・エンディアン・マシンで、IPプロバイダのipv6_tclassおよびipv6_flowフィールドが間違っていました。

  • 終了時にまれなアサーションの失敗を修正します。

  • dtrace -Sが最初のアクションだけを逆アセンブルするのではなく、2つ以上のアクションを含む文内のすべてのアクションを逆アセンブルするようになりました。

  • KPTIの変更によって導入されたアドレス・ゼロの新しいシンボルは、シンボル解決から除外されます。

  • テストスイートおよびテストスイート・ランナーの改善。

ライブラリ・インタフェースの変更:

  • dtrace_proc_*()関数で、不透明なハンドルの構造体dtrace_procに必要な型が変更されました。この不透明なハンドルからPIDを取得する新しい関数dtrace_proc_getpid()があります。dtrace_proc_grab()の名前がdtrace_proc_grab_pid()に変更されました。「INCOMPATIBILITIES」を参照してください。

    これに対応してライブラリのsonameがlibdtrace.so.1にバンプされました。すべてのコンシューマは再リンクする必要がありますが、dtrace_proc_*() APIを使用していないコンシューマはコードを変更する必要がありません。コードの変更が必要な箇所はすべてコンパイル時エラーになるため、変更が必要な箇所を簡単に確認できます。

テストスイートの変更:

  • テスト・ファイルに新しい@@tagを介して追加されたタグ付け: 特定のタグを使用したテストは、環境のTEST_TAGS='a !b'およびruntest.shへの--tag/--no-tag引数を使用してリクエストできます。すべてのタグの交差が実行されるため、前出の例ではaでタグ付けされ、bでタグ付けされていないテストのみが実行されます。test/tags.defaultファイルでデフォルトで適用されるタグを指定し、test/tags.$arch.defaultで1つのアーキテクチャにのみ適用されるタグを指定できます。

0.6.2 (2017年9月12日)

パッケージの変更点:

  • /usr/include/linux/dtraceのDTraceヘッダーは、以前はdtrace-modules-shared-headersパッケージによって提供されていました。このヘッダーはdtrace-utilsパッケージのビルド時に/usr/src/kernelsのkernel-uek-develパッケージから取り込み、dtrace-utils-develパッケージに出荷されるようになりました。

  • libdtrace-ctf 0.7以上が必要になりました。

  • CTF型情報を/lib/modules/$(uname -r)/kernel/vmlinux.ctfaにあるアーカイブで指定できるようになりました。参照されるすべての型がツリー外モジュールではなく、カーネル・ツリー内に見つかった場合に起動時間を短縮できます。

新機能:

  • ログ/線形結果を提供する、新しいllquantize()集積。構文: llquantize(式, 対数の底, 指数の下限, 指数の上限, ステップ, [インクリメント])

  • tracemem()アクションで3番目の引数(トレースするバイト数)が取得されました。2番目の引数(定数である必要がある)とは異なり、3番目の引数は任意のD式になり、これを使用してより大きな2番目の引数を適切な値に制限できます。これにより、Solarisのtracemem()と同等になります。

  • lockstatプロバイダが実装されます。

バグ修正:

  • dtrace_sync()が大幅に高速になりました。レイテンシの問題なく多数のプローブを設定および分解できます。ウォッチドッグ・タイマーの起動がより実用的になりました。

  • D引数のカウントが間違っているときに表示されるエラー・メッセージが、多くの場合、誤っているか紛らわしいものでした。

  • 捕捉されたプロセスが正確に間違った時間に停止した場合のシャットダウン時のセグフォルトが修正されました。

  • Dキーワードと同じ名前を持つカーネル内の構造および共通メンバーを参照できるようになりました。これは主に、selfという名前のメンバーを取得できることを意味します。

  • lquantize()が値を32ビットに切り詰めなくなりました。

  • dtrace_update()がモジュール・アドレス範囲をより適切にマージするようになりました。

  • RCU内でスリープしている重要なセクションを読み取る箇所またはアトミック・コンテキストが発生する可能性のある箇所(モジュール提供、プロファイル/ティック・プロバイダ、より一般的なプローブおよび状態の設定/分解コード)を修正します。

  • これを含まない1つのリリース後、walltimestamp変数が有用な値を再度報告します。

  • (ECBの)メモリーの割当ての失敗によってカーネルがクラッシュする可能性がある1つの箇所が修正されました。

ビルド時:

  • 前述のvmlinux.ctfaアーカイブを生成するためのカーネル・ツリーの新しいmake ctfターゲット。これは、ツリー内モジュールにリンクされなくなりました。このため、ctf.koモジュールと同様に、古いCONFIG_DT_DISABLE_CTFオプションが削除されます。

  • CTFをルートとしてビルドすることができなくなりました。

  • カーネルのCTFタイプの生成では、GCC 6によって生成されたDWARFが認識されるようになりました。また、ビットフィールドの表現に関するもう1つの問題が修正され、手動での保守が大変だったタイプ関連のブロックリストが自動化されました。

  • ioプロバイダ内の未使用の変数警告の一部が削除されます。

0.6.1 (2017年8月7日)

ライセンスの変更:

  • ユーザー・スペースがUniversal Permissive License (UPL) v1.0でライセンスされるようになりました。カーネル・モジュールがGPLv2になり、他のツリー内カーネル・モジュールと同じパッケージで出荷されます。

    /usr/lib64/dtrace/load_dtrace_modulesがyum installを試行しなくなりました(ただし、/etc/dtrace-modulesにリストされているmodprobeモジュールを除く)。

新機能:

  • 新しいlink_ntop()サブルーチンが提供されます。これはinet_ntop()と同様ですが、リンク・レイヤー・アドレスを記述する判読可能な文字列を返します。現在、イーサネットおよびInfiniBandがサポートされています。

  • /etc/dtrace-modulesにデフォルトのモジュール・セットが提供されるようになりました。ファイルは0.4.5以降サポートされていますが、デフォルトでは/etc/dtrace-modulesは出荷されませんでした。

  • TCPおよびUDPプロバイダは、関連するトランスレータとともに実装されます。

  • IOプロバイダは完全に書き換えられ、大幅に改善されました。ほとんどのローカル・ファイル・システムがサポートされ、XFSとNFSが明示的にサポートされるようになりました。

バグ修正:

  • cpu変数を使用する前にsdt.koをロードする必要がありません。

  • dtrace -Gを使用してオブジェクト・ファイルを渡す場合にSPARC64で破損しなくなり、x86以前に行われた同様のバグ修正が繰り返されます。

  • SPARC64でのプロセス状態の追跡を少し改善します。

  • カーネル・タイプのビットフィールドのサポートが改善されています。ただし、一部のビットフィールド、特にマシン用語の境界を越えるビットフィールドはまだ機能しません。

  • dtrace_print_lquantize()では、最下位バケットの名前が正規化されなくなり、バケット・コンテンツのみが正規化されます(意図したとおり)。

  • jstack()が間違ったオフセットからデータをフェッチしており、スタック・ダンプの開始時にガベージ出力になっていました。

  • トレースされたプロセスの高アドレスからの位置合わせされていないデータの読取りに失敗しました。実際にはSPARCだけが、この失敗を引き起こすアドレスにデータを格納しており、ほとんどのアクセスは位置合わせされます。ただし、glibcの内部データ構造の変更に合わせて調整する機械が破損していたため、特定のglibcのアップグレード後にシンボルの検索に失敗します。

  • dtrace -Cおよび-Gでは、/usr/bin/cppおよび/usr/bin/ldにデフォルト設定するのではなく、PATHでcppとldを検索して、ソフトウェア・コレクションのdevtoolsetパッケージなど、デフォルト以外の場所のコンパイラで障害を修正するようになりました。

  • dtrace-utils-develにelfutils-libelf-develが必要になりました。(実際にはこの依存関係は常に存在していましたが、現在まで誤って省略されていました。)

0.6.0 (2017年4月3日)

カーネル・リリース:

4.1.12-97.el6uek

新機能:

  • 関数境界トレース(FBT)は、コア・カーネル内のほとんどの関数のentryプローブでサポートされています。現在の実装では、関数の引数またはreturnプローブの取得はサポートされていません(x86_64での制限されたサポートを除く)。この機能は現在開発中です。

  • ipプロバイダが実装され、他の実装と互換性のあるパラメータや適切なトランスレータによってip:::send、ip:::receive、ip:::drop-inおよびip:::drop-outがサポートされます。IPv4とIPv6の両方がサポートされます。

  • ユーザー・スペース・トレースポイント(USDT)が、64ビット・プロセスと32ビット・プロセスの両方についてSPARCで機能するようになりました。

  • SDTプローブで使用される型とトランスレータが、カーネル・ソースのDTRACE_PROBEマクロから取得されるようになりました。モジュールを変更する必要なく、新しいプローブ引数の型と変換が自動的に選択されます。perf-eventプローブ引数の型は同じ方法で取得されます。

  • SDTプローブに使用されるDTRACE_PROBEn()マクロが新しいDTRACE_PROBE()マクロに置き換えられました。このマクロは、引数をカウントする必要がなく、CONFIG_DTRACEが無効になっている場合でも誤用(型のない引数など)が診断されることを除き、まったく同じように動作します。USDTの場合も同様です。ただし、番号が古いUSDTマクロが、__VA_ARGS__のカンマの省略をサポートしていないコンパイラ(c89/strict-ANSIモードのGCCなど)でコンパイルする必要があるコードでも引き続き使用できるという点を除きます。これには、新しいインストール済内部ヘッダー/usr/include/sys/sdt_internal.hが含まれます。

  • SDTでis-enabledプローブがサポートされるようになりました。これは、指定されたプローブを有効にしないかぎり、常にfalseを返す式であり、通常はif文で直接使用され、コストの高いデータを使用するプローブを有効にするまで、そのプローブの実に必要なこのデータの収集を抑制するために使用できます。

    if (DTRACE_PROBE_ENABLED(probename)) /* expensive stuff */

    DTRACE_PROBE()自体と同様に、DTRACE_PROBE_ENABLED()のプロバイダごとのラッパーを使用できます。

  • dtraceコンシューマ(dtrace(1)を含む)を-pで捕捉できるようになりましたが、その場合、自身を停止できないため、シンボル解決が機能低下します。(以前は、このような捕捉は抑制されていましたが、このようにするコードによってバグが発生し、他のプロセスが終了した後もdtraceが他のプロセスの-cとともに自身の捕捉を実行するように求められた場合、dtraceは終了しませんでした。)

  • ipプロバイダのDトランスレータが使用できるようになりました。

バグ修正:

  • プリエンプション処理の論理エラーのため、プリエンプションが実際には無効になっていない場合に無効になっているという前提でコードが実行されていた可能性があります。

  • プローブ処理(プローブ・コンテキスト)はリエントラントではありませんが、別のプローブを処理した結果として起動されるプローブによって処理コアへのリエントリが発生し、通常、悪影響が生じます。処理コアが、ERRORプローブ処理を除くリエントリ試行をブロックするように変更されました。これは、DTrace設計での意図的な(および許容可能な)例外です。

  • sparc64のD caller変数の値を取得するためのファスト・パス実装が修正されました。

  • D stackアクションの実装がより堅牢になり、メモリー・アクセス障害が致命的なものではなくなりました。

  • D ustackアクションの実装が、安定性と精度を向上させるために完全に修正されました。

  • スキップするスタック・フレームの数が様々なプロバイダの実装の変更に合わせて調整されているため、DTrace関連のフレームが必要に応じてスキップされます。これにより、D stackアクションおよびD caller変数の値が正しくなります。

  • D stackdepth変数を実装すると、DTraceプローブ・スクラッチ・バッファの終了を超えてメモリー書込みが発生する可能性があります。

  • SPARCシステム上の多数のdtrace -c/-pおよびUSDTの修正。dtraceおよび子プロセスのハングからファイル記述子が不足しているdtraceまで様々な症状があります。

  • -cまたは-p exec()を使用してプロセスを頻繁にモニターする場合のメモリーおよびfdリークを修正します。

ユーザーから見える内部の変更:

  • DTraceで/proc/$pid/map_filesが使用されるようになりました(使用可能な場合)。

  • D ustackアクションの実装がカーネルに適切に移動されました。この変更は、ロックのないメカニズムを使用してページ表構造に直接アクセスする必要があるために行われました。

  • システムがパニック・モードに入ったときにプローブ処理がバイパスされます。これにより、DTraceによってパニック関連の出力が中断されなくなります。

  • dtrace -SはDIFが命令カウンタのオフセットをダンプするようになったため、DIF逆アセンブリをカーネルからのエラーとより簡単に一致させることができます。

  • DIF述語がdtrace -S出力で逆アセンブルされます。

0.5.4 (2016年11月8日)

回避策:

  • dtrace -Gの使用時にオブジェクト・ファイルが大量に破損するelfutilsのバグを回避します。

0.5.3 (2016年5月25日)

カーネル・リリース:

4.1.12-43.el6uek

新機能:

  • perf-eventsをDTrace SDTプローブとして表示できるようになりました。この機能は、カーネルでデフォルトで有効になっています。このプローブはperf-eventsと同じ名前で表示され、新しいperf SDTプロバイダでグループ化されます。

    現在の実装では、perf-events DTraceプローブは、標準のDTrace SDTプローブとは異なり、引数の型情報を提供しません。

バグ修正:

  • sparc64では、SDTプローブ・トランポリン用に確保されているメモリーの処理のためにsdt DTraceマルチプロバイダ・モジュールをアンロードおよびリロードすることによって、システムをクラッシュさせる可能性がありました。このバグは修正されました。

クラッシュの修正:

  • 捕捉したプロセス(ustack()など)の終了と同時にdtrace(1)が終了した場合、デッドロックまたはクラッシュが発生し、アサーション失敗またはセグメンテーション・フォルトが発生する可能性がありました。

0.5.2 (2016年2月3日)

カーネル・リリース:

4.1.12-33.el6uek

クラッシュの修正:

  • USDTプローブを含むプログラムは、共有ライブラリがアドレス空間の上半分にマッピングされている場合、起動時にクラッシュしたり、dlopen()時間が発生したりすることがあります。これはx86-64では発生しませんが、SPARC64では一般的です。dtrace -Gは、固定のELFコンストラクタにリンクするために、USDTプローブを含むこのようなプラットフォーム上で再実行する必要があります。

パフォーマンスの向上:

  • dtrace(1)がCPU負荷の高いループで時間を浪費しなくなりました。以前は、スリープ中のコードが誤って時間を選択し、ほぼ半分の時間でスリープしていました

バグ修正:

  • dtrace -cおよび-pがSPARC64で動作するようになりました。

  • entryプローブとreturnプローブの両方がシステム・コールに対して有効になっている場合、最初のプローブを無効にすると、2番目のプローブがまだアクティブな場合でも、システム・コール表内の関数ポインタがデフォルト値にリセットされていました。これにより、システム・コール・プローブの状態で競合状態が発生する可能性がありました。

  • SPARC64 R_L7レジスタへのアクセスがoff-by-oneバグのため、常に失敗していました。

  • ユーザー・プロセスのスタックの先頭を通り越して読み取られる場合がありました。スタック・スロットを読み取るメカニズムも更新され、アーキテクチャ全体の効率、一貫性、および信頼性が向上しました。

  • ユーザー・スペース・プロセスのスタックを読み取る間、スタック・バイアスが必要とするアーキテクチャに適用されていなかったため、基本的に無効な値が大量に発生し、結果が損なわれていました。

0.5.1 (2015年11月17日)

カーネル・リリース:

4.1.12-24.el6uek

バグ修正:

  • copyout()またはcopyoutstr()をDスクリプトで使用すると、権限のないメモリー・アクセスから保護するために安全性チェックが適用されるようになりました。

  • インストール制限に達したときに、DTraceモジュール・パッケージによってカーネルRPMの自動削除が阻止されなくなりました。

  • copyin()を使用して、タスクのpsinfo内のenvp配列およびargv配列にアクセスできるようになりました。これは、DTrace対応システム全体の規則です。

パフォーマンスの向上:

  • dtrace(1)とlibdtrace(1)の起動速度が改善されます。どちらもmodules.orderファイルを使用して使用可能なカーネル・モジュールを特定することでファイル・システム・ウォークを回避し、C識別子にできない可能性のある不適格なプローブ名(tick-1secなど)があるときに可能性のある型を解決するためにすべてのカーネル・モジュールをロードすることを回避することによって改善されます。ディスク・キャッシュがコールドになっている場合、このような変更によって起動が2倍高速化されます。

ユーザーから見える内部の変更:

  • DTRACE_DEBUGデバッグ・オプションは、複数のスレッドが一度にデバッグを発行したときに、制限された方法でデバッグ出力を混在させる可能性があります。

0.5.0 (2015年8月10日)

カーネル・リリース:

4.1.4-4.el6uek

新しいアーキテクチャ:

  • SPARC64上のLinuxは、dtrace、profile、syscallおよびSDTプロバイダでサポートされています。ユーザー・スペース・トレースはまだ機能しません。

  • カーネル・レベル(kuidおよびkgid)でのネームスペース・サポートに対応するために、uid / gid処理が更新されました。Dサブルーチンによって報告(または構造から取得)されるすべてのuid / gid値は、初期ユーザー・ネームスペースに基づいて評価されます。

新規オプション:

  • -xuseruid: 非systemdシステム(OL6など)で、最初の非システム・ユーザーのユーザーIDを指定します。(通常はデフォルト値が適切です。)この下のuidを持ち、実際にはデーモンのように見えるプロセスは、dtrace -pまたは-cで明示的に指定されている場合にのみptrace()dになります。

  • -xsysslice: systemdシステム(OL7など)で、システム・スライスの名前を指定します。(ほとんどの場合、デフォルト値が適切です。)このスライスまたはルート・スライス内のプロセスは、重要なシステム・デーモンとみなされ、前述のように明示的に指定されている場合にのみptrace()dとなります。

    systemd/非systemdの決定は動的に行われるため、initシステムを自由に切り替えることができ、すべてが引き続き機能します。

ユーザーから見える内部の変更:

  • UEK4 4.1カーネルのトランスレータのサポート。

  • NOFAULT保護下でカーネル・メモリーにアクセスすると、NOPF (ページ・フォルトなし)も意味するようになりました。以前は、NOPFはNOFAULTに加えて設定できるオプションでした。

  • デバッグ出力が改善されました(コンパイル時に有効になる)。

  • 以前はsdt_instr_tと呼ばれていたデータ型の名前がasm_instr_tに変更されました。この変更が行われたのは、このデータ型がSDTプロバイダ以外のコードで使用されるため、より汎用的な名前が適切であるためです。

バグ修正:

  • トレース不可能なプロセスのシンボル解決が改善されています。

  • PIDが無効なdtrace -pで、適切なエラー・メッセージが生成されるようになりました。

0.4.6 (2015年6月30日)

新しい依存関係:

  • dtrace-utils-develが、インストールされているバージョンではなく、対応するバージョンのdtrace-utilsを常に取得するようになりました。[DTrace 0.3.0で導入されました。]

  • dtrace-modules 0.4.4でDTraceカーネル・ヘッダー・パッケージの名前がdtrace-modules-shared-headersに変更されました。dtrace-utilsでは、この名前が使用されています。

新規オプション:

  • dtrace -vVが、dtraceのリリース済バージョンに関する情報およびdtrace(1)とlibdtrace(1)の内部バージョン制御IDを報告するようになりました。(インストールで障害が発生していないかぎり、最後の2つは常に同じである必要があります。)

バグ修正:

  • 通常の操作でSIGTRAPを受信するプロセスが、ustack()などにdtraceされているときでも動作するようになりました。以前は、SIGTRAPが無視されていました。[導入(意図的) DTrace 0.4.5では、このケースは0.4.0以降の別の方法で誤った動作が発生していました。]

  • DTraceでは、DTraceによる動的リンク・ステートの参照中に、exec()のプロセスのトラックを失う問題が修正されました。

  • DTraceがfork()edプロセスの中でブレークポイントを離れることはなくなり、プロセスから正しく分離してブレークポイントを削除するようになりました。

  • DTraceがモニターを停止してから所有したプロセスのシンボル表の状態を認識する問題が修正されました。

  • DTraceでdlopen() / dlclose()を実行するマルチスレッド・プロセスがクラッシュしなくなりました。[すべてDTrace 0.4.0で導入されました。]

ライブラリ・インタフェースの変更:

  • 出荷されなかったSolarisに固有のヘッダーが存在しないため、<dtrace.h>のインクルードが失敗していました。このヘッダーはコールされなくなりました。

ユーザーから見える内部の変更:

  • DTraceが実行中のカーネルによって異なる名前のディレクトリからDライブラリを(トランスレータなどで)ロードするため、同じユーザー・スペース・パッケージで複数のカーネルをサポートできるようになりました。

既知の問題点:

  • 最初のスレッド以外のスレッドでdlopen()を実行するu{stack,sym,addr,mod}()でマルチスレッド化されたプロセスには、このようなdlopen()によって導入されたシンボルの正確なシンボル解決ができない場合があります。

0.4.5 (2015年6月17日)

カーネル・リリース:

3.8.13-87.el6uek

新機能:

  • プロバイダ・モジュールが、DTraceが初めて初期化されたときに、dtrace.koと同時に/etc/dtrace-modulesから自動的にロードされるようになりました。(dtrace-modulesパッケージに含まれていないプロバイダは、自動的にyum installされません。)

  • 64ビット・ホスト上の32ビット・アプリケーションでUSDTプローブを使用できるようになりました。

バグ修正:

  • DTraceのヘルプ・トレース機能での(軽度な)メモリー・リークの問題が修正されました。dtrace.koモジュールのロード時に、バッファ(デフォルトで64K)が割り当てられていたため、リリースされませんでした。

  • 特定のプローブをスキップするフレーム数の調整が修正された結果、スタック・バックトレースがより正確になりました。

  • x86_64以外のアーキテクチャをサポートするための準備での詳細な監査の後に、データ型がより慎重に指定されるように調整されました。

  • スタックの深さは、割当てられた一時バッファ(vmalloc)に書き込まれるバックトレースのリクエストにより決定されたため、メモリー割当てをサポートしていないコンテキストでプローブが実行される場合に重大な問題が発生しました。現在、バッファは、プローブ処理のためにDTraceは提供するスクラッチ領域から取得されます。

  • 無効なポインタをd_path()に渡すと、システムがクラッシュする可能性がありました。実装により制限されるため、安全なメモリー・アクセスを使用してこれを回避することはできません。かわりに引数として渡されたポインタが、カーネルでd_path()をコールする前に検証される必要があります。

  • プロセスの初期の捕捉または作成の失敗時の断続的なdtraceクラッシュを修正します(dtrace -pまたは-cを介して、あるいはustack()、usym()、uaddr()またはumod()を介して)。

  • dtrace -S DIF subr名を修正します。[DTrace 0.4.0で導入されました。]

  • DTraceでは、exec()を実行するプロセスとシグナルを停止して後で再開することでヒットされるプロセスを確実にモニターできるようになりました。(以前は、被害プロセスを追跡しなくなったり、SIGTRAPで強制終了したり、クラッシュすることがありました。)この領域では、多くの微妙なバグとデッドロックが副作用として修正されています。

  • モニター対象のプロセスがクラッシュする原因となる可能性のあるブレークポイント命令のポークでの符号拡張バグを修正します。[DTrace 0.4.0で導入されました。]

  • glibcの変更に対するDTraceのリジリエンスが改善されています。glibcのABI保証されていない内部が依存する多くの箇所が正しいフィールド・オフセットを動的に検索するようになったため、glibcの内部構造に表示される新しいフィールドとフィールドのサイズの変更に対するリジリエンスを持つようになりました。

ライブラリ・インタフェースの変更:

  • dtrace_proc_*()関数で使用される型が変更されました(値によって渡される小さな構造になりました)。「INCOMPATIBILITIES」を参照してください。

    libdtraceコンシューマには、まだバイナリ互換性の保証がありません。

ユーザーから見える内部の変更:

  • 今後のリリースでは、x86_64以外のアーキテクチャのサポートを容易にするためにコードが再構築されています。

  • d_path() Dサブルーチンは、その引数を、現在のタスクで認識されたファイルに対応するパス構造に対するポインタにする必要があります(次の「バグ修正」を参照)。

既知の問題点:

  • u{stack,sym,addr,mod}()の下のプロセスはSIGTRAPを受信できません。

  • 最初のスレッド以外のスレッドでdlopen()を実行するu{stack,sym,addr,mod}()の下にあるマルチスレッド・プロセスがクラッシュすることがあります。

0.4.4 (2015年3月12日)

カーネル・リリース:

3.8.13-69.el6uek

新規オプション:

  • -xcppargs: DTraceでDスクリプトを実行するときにプリプロセッサに渡す追加の引数。

バグ修正:

  • dtrace -Gによって生成されたDOF ELFオブジェクトには、実行可能なスタックが必要なくなりました。

  • dtrace-modules-headersパッケージの名前がdtrace-modules-shared-headersに変更され、時間とともにシンボルにバージョニングされているプロバイダとバージョニングされていないプロバイダの両方が含まれるYumの問題が回避されました。

0.4.3 (2014年5月1日)

カーネル・リリース:

3.8.13-33.el6uek

新機能:

  • タイマー・ベースのprofile-*プローブ(プロファイル・プロバイダ)。これらのプローブは、UEK3カーネル(3.8.13-32以上)の普及している循環サポートを使用して、アクティブなCPUごとに特定の頻度/間隔でプローブを起動します。

バグ修正:

  • プロセス処理におけるメモリー割当て、不足および超過のバグがいくつか修正されました。十分に精巧な仕掛けを使用すれば、ローカル・ユーザーがこれを利用して、特殊なELF実行可能ファイルを巧みに作成および実行したり、dtraceがこれらにアタッチするように調整できる場合があります。

  • pid変数とppid変数が、PIDのユーザー・スペースの概念(スレッド・アプリケーション用)と同じではないカーネル・タスクPIDに基づいて報告されていました。(より正しく)スレッド・グループID (tgid)を渡すようになりました。

  • ユーザー・スペースはスレッド・カーネル・レベルpidを認識しないため、ustack、usymなどの結果でtgidも渡すようになりました。最初のスロットでtgidを、2番目のスロットで(カーネル) pidを渡します。

  • タスクのスタックへのアクセス中のロック、スタック検出および潜在的なページ・フォルトを処理するために、dtrace_getufpstack()実装が大幅に修正されました。

既知の問題点:

  • 以前のコードの変更によって、すべてのメモリー割当てリクエストの障害がチェックされるようになったため、主バッファ割当ての自動サイズ動作のテストでは、バッファ・サイズを減らして操作を続行するのではなく、dtraceユーティリティによる処理が中止されます。これは、今後のリリースで対処される全体的に害のないリグレッションです。

0.4.2 (2013年12月20日)

カーネル・リリース:

3.8.13-22.el6uek

新機能:

  • カーネル・モジュールのSDTプローブ・ポイントがサポートされるようになりました。

  • vtimestamp D変数が実装されました。

バグ修正:

  • 実行中のdtraceをkill -9で強制終了しても、ustack()、usym()、uaddr()またはumod)の副作用として捕捉された制御端末がないプロセスで、ブレークポイントが未処理になることがなくなります。副作用として、このようなプロセスでのシンボル解決はそれほど正確ではなくなります。dtrace -pを介して制御端末がないプロセスを捕捉すると、ブレークポイントの再削除と引換えにこれらのプロセスの完全なシンボル解決精度が復元されます。制御端末を持つプロセスは、以前のリリースと同様に処理されます。

  • マルチスレッド・プロセスのustack()、usym()、uaddr()およびumod()によるシステムのクラッシュ、カーネルのエラー、プローブされているプロセスのハング、dtrace(1)自体のクラッシュ、dtraceまたはシステムのファイルハンドルからの全体としての実行がなくなります。

  • モニター対象のプロセスが同時に停止している間に、SIGINTを使用してdtraceを中断すると、永続的にハングするのではなく、停止するようになりました。

  • dtraceのシンボル解決パスが、参照中にプロセスが停止したときに発生する可能性のある様々な問題に対して装備されます。

  • マルチスレッド・プロセスに対してpidとppidが正しく導出され、スレッドおよびスレッド・グループのリーダーではなく、それぞれPOSIX pidと親を指すようになりました。

  • モジュールの開始位置にあるカーネル・シンボルを解決しても、dtraceユーザー・スペースが初期化されていないメモリーをポインタとして間接参照しなくなりました。

0.4.1 (2013年11月6日)

カーネル・リリース:

3.8.13-16.2.1.el6uek

新機能:

  • DTraceが必要に応じてdtrace.koに対して自動的にmodprobeを実行し、modprobeがシステムで見つからない場合はyum installされるようになりました。プロバイダ・モジュールには自動的にmodprobeが実行されませんが、(たとえば) dtrace -lを実行すると、モジュールがシステムに存在することを確認して、modprobeを実行できます。

  • ユーザー・スペース・プロセスのコンテキスト内で一意のプロバイダ名を保持することができなくなりました。つまり、メイン実行可能ファイルとロード済共有ライブラリ、または2つのロード済共有ライブラリでは、同じプロバイダ名をDOFセクションに一覧表示することができません。

  • 新しい循環実装がUEK3カーネルに含まれ、よりエラー発生しやすい以前のバージョンが置き換えられました。新しい実装を使用するようにモジュール・コードが更新されました。

  • 新しい開発ツールshowUSDT (DOFセクションのダンプ用)およびctf_module_dump (カーネル・モジュール内のCTFのダンプ用)。(以前のツールは例のみであり、ドキュメントのディレクトリにインストールされます。)

バグ修正:

  • Dスクリプトに8192文字の間隔でプラグマまたはコメントが含まれている場合に擬似エラーが発生する原因となっていたレクサー・バグが修正され、16KiBより大きいスクリプトの使用が完全に阻止されました。[元のLinuxポートで導入]

  • 様々なメモリー・リークおよび初期化されていないメモリー読取りが固定されます。

  • 通常のSIGINTでdtraceが途中で中断された場合に、プロセスでブレークポイントが未処理のままになる可能性があるバグが修正されます。[DTrace 0.4.0で導入されました。]

  • .SUNW_dofセクションの可視性がよくありませんでした。[DTrace 0.4.0で導入されました。]

  • デバイスにパーティションがない場合のdevinfo_tのdev_statnameおよびdev_pathnameを修正します。[DTrace 0.4.0で導入されました。]

  • DOFを含むプログラムおよび共有ライブラリにコンストラクタを提供するdrti.oは、DTraceが実行されていないときのオーバーヘッドが低くなり、エラーを標準エラーではなく標準出力に出力し、O_CLOEXECでファイルを開くようになりました。[DTrace 0.4.0で導入されました。]

  • 元のコードから継承されたロック順序の問題が修正されます。

  • ユーザー・スペース・スタック・メモリーのアクセスが安全な方法で実行されるようになりました。

  • 投機トレース・バッファ・クリーニングとコンシューマ状態の破棄の間の競合状況が解決されました。

  • コンシューマ状態に関連するメモリー・リークが修正されました。

  • プロバイダ参照カウンタ計算の問題が解決されました。

  • errno D変数が、syscall:::returnプローブ・アクションの実行中に正しい値を保持するようになりました。つまり、システム・コールがエラーなしで完了した場合は0、システム・コールが失敗した場合は有効なエラー・コードが保持されます。

0.4.0 (2013年9月20日)

カーネル・リリース:

3.8.13-16.el6uek

新機能:

  • fasttrap (ユーザー・スペース・トレースに使用)などのメタプロバイダのサポート。メタプロバイダでは、(必要に応じて)プロバイダを動的にインスタンス化するためのフレームワークを実装します。

  • ユーザー・スペース静的定義トレース(USDT)は、ユーザー・スペース実行可能ファイルおよびライブラリでSDTに似たプローブをサポートします。通常のSDTに似たプローブとis-enabledプローブの2種類のプローブを使用できます。USDTのサポートに新しいヘッダー・ファイル(sys/sdt.h)がインストールされます。

  • fasttrapプロバイダは実装されていますが、現在はUSDTプローブのみがサポートされています。

  • シンボル参照が動作するようになりました。stack()とustack()が、&のようにシンボルを出力するようになりました。ustack()は、dlopen()とdlmopen()、およびDT_NEEDEDでロードされたライブラリ内のシンボルを参照できます。ユーザー・スペース・プロセスにおけるグローバル・シンボルのシンボル参照では、シンボルの介入およびその他すべてのシンボルの順序指定方法が考慮されます。関与するマシンの一部は、GNU Cライブラリの特定のバージョンに対して実行されるプログラムでのみ動作します。(OELで出荷されたglibcのバージョンでは常に機能し、互換性のないglibcが使用中であるように見える場合は、シンボルの介入をサポートしない単純なアプローチまたはdlmopen()にフォールバックします)。

    これはカーネルの新しいマシン(特にwaitfd()およびPTRACE_GETMAPFD)に依存しているため、以前のDTraceカーネルでは機能しません。

  • -xevaltime={preinit, postinit, main}が機能するようになりました。次の注意事項があります。

    • postinit (デフォルト)はmainと同等です。

    • 静的にリンクされたバイナリでは、preinitはexecと同等であり、ld.soの初期化(このようなバイナリでmain()の後に発生)をスキップすることはできません。

    • ストリップされ、静的にリンクされたバイナリ、postinitおよびmainはpreinitと同等です。これは、シンボル表がない場合にmainシンボルを検索できないためです。

  • DTRACE_OPT_*という名前の環境変数からDTraceオプションを設定できるようになりました。次に例を示します。

    export DTRACE_OPT_INCDIR=/usr/lib64/dtrace:/usr/include/sys

ユーザーから見える内部の変更:

  • CTFデータが格納されるELFセクションが.dtrace_ctfから.ctfに変更されました。

  • 内部カーネル・シンボルのストレージ表現が改善され、起動時のDTraceメモリー使用量が1MBほど節約されます。

  • libdtraceパブリックAPIヘッダーは、その引数に名前を付けるようになりました。その他のいくつかのlibdtrace関数のプロトタイプが変更されました。「INCOMPATIBILITIES」を参照してください。

  • Solarisのマニュアルに記載されていない2つのlibproc環境変数が削除されました。これは、これらの環境変数によって動作が調整されたコードがもう存在しないためです。

  • オーバーヘッドの低い新しいデバッグ・マシン。環境内のDTRACE_DEBUG=signalをエクスポートすると、DTraceがSIGUSR1によってヒットした場合にのみデバッグ出力が表示され、それまでのすべてのprintf()ロック・オーバーヘッドが回避されます。リング・バッファを使用してデバッグ出力を停止します。デフォルトでは、サイズは100Mbで、DTRACE_DEBUG_BUF_SIZE変数を介して変更可能です(サイズはMB単位です)。

  • 以前はメタプロバイダとして定義されていたもの(後述する「0.2.0」を参照)は、実際はマルチプロバイダとして定義する方が適しています。つまり、プローブがすべて同じプロバイダ(sdt)によって提供されていてもプロバイダに一緒にグループ化されるSDTなど、基本的に単一の実装(の大半)を共有する複数のプロバイダを処理するプロバイダ・フレームワークです。

  • 適切なカーネルのDTraceヘッダー・ファイル、カーネル・モジュールおよびユーザー・スペース・ユーティリティが、重複を回避して、より一貫性のあるクリーンな設計を提供するために再構築されました。また、カスタム・コンシューマやその他のDTrace関連ユーティリティのサポートも向上します。

  • systraceプロバイダがLinuxカーネル(2.6.39から3.8.13の間)の変更点に対応するように更新されました。

バグ修正:

  • ERRレジスタに適切な値を取得できるようになりました。

  • ustack()およびjstack()アクションは、結果配列の最初の要素としてPIDを正しく渡しませんでした。

  • ustack()アクションの実装が置き換えられました。

  • 不明瞭なロックの問題がいくつか解決されました。

  • arg5からarg9の正しい処理。

  • -hおよび-Gコマンドライン・オプションが機能します。

  • 正の整数のみを受け取るDTraceオプションに渡された負の値が、正しくエラーと診断されます。

既知の問題点:

  • 現在、実行中のdtraceをkill -9で強制終了すると、他のプロセスでブレークポイントが未処理のままになることがあります(これらはいずれ強制終了される可能性があります)。これは、将来的に修正されます(多くの場合でブレークポイントを使用しないようにします)。

0.3.0 (2012年9月14日)

カーネル・リリース:

2.6.39-201.0.1.el6uek

新機能:

  • CTFのサポート。これによって、グローバル・スコープで宣言されたすべてのカーネル・タイプがDTraceスクリプトに公開されます(単一ファイルに対してプライベートなものであっても)。静的と宣言されていないすべてのグローバル・カーネル変数は、`演算子で外部変数として使用することもできます。

    カーネル全体のシンボルのモジュールはvmlinuxと呼ばれますが、名前としてgenunixを使用して、スクリプトの移植性を高めることもできます。

    カーネル提供のファイル/proc/kallmodsymsと同様に、この機能が動作するには、互換性のあるカーネルのカーネル・モジュールをDTraceから参照できる必要があります。DTraceは、カーネル・モジュールなし、/procの表示なし、またはモジュールにタイプ情報が含まれていないカーネルで動作しますが、カーネル・タイプまたは変数は使用できません。(次の-xprocfspathおよび-xmodpathを参照してください。)

  • curcpu組込み変数が、現在アクティブなCPUのCPU情報構造へのポインタを提供するDIF組込み変数としてLinuxに実装されました。

  • 新しいDIFサブルーチンd_path()が実装されました。このサブルーチンは、引数としてパス構造へのポインタを取り、そのパスのフルパス名を表す文字列を返します。

  • raise()アクションが実装されました。このアクションにより、Dスクリプトは現在のタスクでシグナルを発生させることができます。

  • ioプロバイダ・プローブが実装されました。SDTプローブstart、wait-start、wait-done、doneが提供されます。

  • procプロバイダが実装されました。SDTプローブcreate、exec、exec-failure、exit、lwp-create、lwp-exit、lwp-start、signal-clear、signal-discard、signal-handle、signal-send、startが提供されます。

  • schedプロバイダが実装されました。SDTプローブchange-pri、dequeue、enqueue、off-cpu、on-cpu、preempt、remain-cpu、sleep、surrender、tick、wakeupが提供されます。

  • io、procおよびschedプロバイダ・プローブの引数マッピングが提供されました。この情報は、ユーザー・スペース・コンシューマで使用されます。

新しい依存関係:

  • DTraceが、Solaris libctfタイプ・ストレージ・ライブラリの変更されたGPLedポートであるlibdtrace-ctfに依存するようになりました。その名前にもかかわらず、Solaris CTFファイルを読み取ることはできません。ファイル形式に互換性がありません。

新規オプション:

  • -xprocfspath: 設定されている場合は、/procへのパスを指定します。chrootで役立つ場合があります。ただし、/procを別の場所に移動すると、glibcなどが破損することがあります。

  • -xmodpath: 設定されている場合は、/lib/modules/$(uname -r)を検索せず、カーネル・モジュールへのパスを指定します。

削除されたオプション:

  • 文書化されていない-xlinkmode=primaryオプションが削除されます。これはDTrace for Linuxでは機能しませんでした。

バグ修正:

  • -cおよび-pコマンドライン・オプションが機能します。

  • モジュールを積極的かつ不必要に読み取るレクサー・バグが修正されました。そのため、入力誤りのないスクリプトとともに使用すると、DTraceがSolarisでこれまでよりもずっと速く起動するようになりました(多くの場合、約半分の時間)。このバグ修正と次のバグ修正の結果として、エラー・メッセージのエラー・テキストが変更されている(エラー・タグはない)場合があります。

  • SDTプロバイダが、DTraceユーザー・スペースに対する引数の型を記述するようになりました。

  • 多くのDTraceアクションおよび変数の型が、Linuxの現実に対応するように修正されています。

  • errno.dで使用可能なエラー番号のセットがより完全になっています。

  • DTraceライブラリが/usr/libではなく、/usr/lib64にインストールされるようになりました。

  • dtrace -Cのユーザーが、インシデントなしで<sys/dtrace.h>を含めることができるようになりました。

  • プローブが割込みコンテキストで実行されたときに常にinitタスクに基づいてハードコーディングされた値を提供していた様々なDIF組込み変数によって、現在のタスクから実際の値が提供されるようになりました。Linuxでは、常にcurrentとして使用できる有効なタスク構造があります。

  • x86_64アーキテクチャのレジスタの番号付けが、スタックにプッシュされたレジスタの順序と一致するように更新されました。

  • DS、ES、FSおよびGSレジスタの正しい値を取得できるようになりました。

  • SDTメタプロバイダ・モジュールがシステムからアンロードされたときに、SDTプローブが正しくクリーン・アップされるようになりました。

  • rw_read_held() DIFサブルーチンが、正しい引数データ型に基づいて、渡された引数に安全にアクセスできるかどうかを検証するようになりました。

ユーザーから見える内部の変更:

  • /proc/kallsymsのように新しいファイル/proc/kallmodsymsが存在するようになりましたが、現在組み込まれている場合でも、オブジェクト・サイズを指定し、各カーネル・オブジェクトが属するモジュールを一覧表示します。

  • dtrace.koがロードされるたびに、新しいモジュールdtrace_ctf.koがプルされます。これは型情報のコンテナです。

  • 文書化されていない-B buffer-inspectionコマンドライン・オプションが、DTraceをクラッシュしなくなりました。

  • SDTプローブをサポートするために以前に提供された無効なオペランド・トラップ・ロジックは、この機能を利用するプローブをサポートするために、より汎用的になりました。

  • DTraceコア・モジュールがコア・カーネルCTFデータ・モジュールに依存し、DTraceモジュールがシステムにロードされると、カーネルのCTFデータも使用可能になるようになりました。

0.2.5 (2012年3月19日)

ユーザー・スペース・リリースのみ。

新機能:

  • libdtraceが、OpenSolarisの場合と同様に非常に類似したAPIで共有ライブラリになりました。現在、このライブラリに関してAPIまたはABI互換性の保証はありません。

0.2.4 (2012年2月15日)

カーネル・リリース:

2.6.39-101.0.1.el6uek

バグ修正:

  • プロバイダ・モジュールが参照カウンタを使用して、現在有効なプローブがあるかどうかを判断するようになりました。参照カウンタの値がゼロより大きい場合は常に、プロバイダ・モジュールを参照してアンロードできないことを確認します。カウンタがゼロに下がると、モジュールへの参照が解放されます。これにより、一部のプローブがまだ使用されている間にプロバイダがアンロードされなくなります(通常これによりカーネル・パニックが発生します)。

0.2.3 (2012年2月10日)

カーネル・リリース:

2.6.39-101.0.1.el6uek

内部変更:

  • DTraceコアが、ユーザー・スペースのdtraceコンシューマ・ユーティリティに追加されたquietresizeオプションに対応する28のDTraceオプション設定をサポートするように更新されました。

バグ修正:

  • DTraceコア実装の様々なアサーションで、テストによって現在のタスクがmutexを保持しているかどうかを判断する場合にmutex_is_locked()が誤って使用されていました。このドキュメントは修正されました。

0.2.0 (2012年1月25日)

カーネル・リリース:

2.6.39-101.0.1.el6uek

このリリースでは、以前のリリースの2.6.32に基づくアップグレードとして、DTrace for Linuxを2.6.39カーネルにします。

新機能:

  • DTraceコアおよびプロバイダAPIが、共通の実装を使用して複数のプロバイダを提供するフレームワークであるメタプロバイダをサポートするようになりました。

  • 静的定義トレース(SDT)プロバイダが実装され、カーネル内の静的プローブが提供されます。一部のprocプロバイダは、この機能を使用して実装されます。

バグ修正:

  • スタブベースのシステム・コール(fork、clone、exit、sigreturnなど)のシステム・コール・トレースが機能するようになりました。

  • Dスクリプト内の無効なメモリー・アクセスによって、エラーまたはパニックが発生しなくなりました。

  • Dスクリプト内のメモリー不足によって、擬似エラーが発行されなくなりました。

  • いくつかのクラッシュの修正。

  • quantize()を修正して、集積体内の算術を修正します。

  • インストールされたヘッダーの改善。

内部変更:

  • 最小の循環実装が、コア・カーネルの同等のGPL実装によって提供されるようになったため、DTraceモジュールから削除されました。

  • CPUコア情報がコア・カーネル・レベルで維持されるようになりました。

  • CPUコア情報構造にフラグを設定して、カーネルおよびモジュール・コードで安全なメモリー・アクセスを実行できるようになりました。メモリー・アクセスによってページ・フォルトまたは一般保護障害が発生した場合は、障害がCPU障害として記録され、カーネル・パニックを発生させずに実行が続行されます。

  • スタックの歩行に依存する機能(スタックの深さの決定やバックトレースの収集)が、コア・カーネルのGPL実装によって提供されるようになりました。

  • 一貫性を保つために、メイン・カーネル・イメージを表す擬似カーネル・モジュール構造がコア・カーネル・レベルで作成されます。このモジュール構造により、すべてのカーネル・レベルのオブジェクトを均等に表現できます。この構造は、コア・カーネル内のSDTプローブの場所のリストを提供します。

0.1.0 (2011年10月20日)

最初のリリース。

作業コンポーネント:

  • D言語全体(シンボル検索またはCTFに依存する部分を除く)

  • DTraceコア機能の大部分が実装されており、ほぼ完全なDIF/DOF実装(述語、集積および投機トレースのサポートを含む)、プロバイダAPI、ユーザー・スペース・コンシューマ用のioctlインタフェースおよび直接プローブ起動が提供されます。

  • BEGIN、ENDおよびERRORプローブ(dtraceプロバイダ)。

  • システム・コールのentryプローブとreturnプローブ(systraceプロバイダ) (無効になっているクローン・プローブを除く)

  • プロファイル・プロバイダ(タイマー・ベースのtick-*プローブ、任意の精度プロファイル・タイマーなし)。

  • カーネル・スタックのトレースバック。ただし、ustack()はアドレスのみを出力し、シンボルは出力しません

現在存在していない主要コンポーネントに、sdt usdtを含む他のすべてのプロバイダが含まれます。