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}()の下にあるマルチスレッド・プロセスがクラッシュすることがあります。