次の方法で共有


デバッガーが不要なシンボルを検索しないようにする

最終更新日:

  • 2007 年 5 月 27 日

あなたがドライバーのデバッグ中にブレークポイントに到達するのは、自身が所有しておらず、手元のデバッグ タスクには何の関係もないドライバーのシンボルの読み込みを試みている間に、デバッガーが非常に長い間一時停止するだけのときです。 どうなっているのですか。

既定では、シンボルは必要に応じてデバッガーによって読み込まれます。 (遅延シンボルの読み込みまたは遅延シンボルの読み込みと呼ばれます)。デバッガーは、シンボルの表示を呼び出すコマンドを実行するたびにシンボルを検索します。 これは、現在のコンテキストで有効でないウォッチ変数 (現在のスタック フレームに存在しない関数パラメーターやローカル変数など) を設定した場合、コンテキストが変更されると無効になるため、ブレークポイントで発生する可能性があります。 また、シンボル名を誤って入力したり、無効なデバッガー コマンドを実行したりするだけで、デバッガーが一致するシンボルの検索を開始した場合にも発生する可能性があります。

なぜこれがそれほど時間がかかるのですか? これは、シンボル名が修飾されているか非修飾であるかによって異なります。 修飾されたシンボル名の前に、シンボルを含むモジュールの名前が付けられます (例: myModule!myVar)。 修飾されていないシンボル名では、モジュール名 (myOtherVar など) は指定されません。

修飾名の場合、デバッガーは指定されたモジュール内のシンボルを検索し、モジュールがまだ読み込まれていない場合は、モジュールを読み込みます (モジュールが存在し、シンボルが含まれている場合)。 これはかなり早く起こります。

修飾されていない名前の場合、デバッガーはどのモジュールにシンボルが含まれているかを "認識" しないため、すべてのモジュールを調べなければなりません。 デバッガーはまず、読み込まれたすべてのモジュールでシンボルをチェックし、読み込まれたモジュール内のシンボルと一致できない場合、デバッガーは、アンロードされたすべてのモジュールを読み込み、ダウンストリーム ストアから開始し、シンボル サーバーで終了することで検索を続行します (シンボル サーバーを使用している場合)。 明らかに、これには多くの時間がかかる場合があります。

修飾されていないシンボルの自動読み込みを防ぐ方法

SYMOPT_NO_UNQUALIFIED_LOADS オプションは、修飾されていないシンボルを検索するときに、デバッガーによるモジュールの自動読み込みを無効または有効にします。 SYMOPT_NO_UNQUALIFIED_LOADSが設定され、デバッガーは、修飾されていないシンボルとの一致を試みると、既に読み込まれているモジュールのみを検索し、アンロードされたモジュールを読み込んで検索を続行するのではなく、シンボルと一致できない場合は検索を停止します。 このオプションは、修飾名の検索には影響しません。

SYMOPT_NO_UNQUALIFIED_LOADS は既定でオフになっています。 このオプションをアクティブにするには、 -snul コマンド ライン オプションを使用するか、デバッガーの実行中に 、.symopt+0x100 または .symopt-0x100 を使用してオプションをオンまたはオフにします。

SYMOPT_NO_UNQUALIFIED_LOADSの効果を確認するには、次の実験を試してください。

  1. n コマンド ライン オプションを使用してノイズ シンボルの読み込み (SYMOPT_DEBUG) をアクティブ化するか、デバッガーが既に実行されている場合は、.symopt+ 0x80000000 または !sym ノイズ デバッガー拡張機能コマンドを使用します。 SYMOPT_DEBUG は、読み込まれる各モジュールの名前や、デバッガーでファイルが見つからない場合のエラー メッセージなど、シンボルの検索に関する情報を表示するようにデバッガーに指示します。
  2. 存在しないシンボルを評価するようにデバッガーに指示します (例: ?asdasdasd 型)。 存在しないシンボルを検索するときに、デバッガーは多数のエラーを報告する必要があります。
  3. .symopt+0x100 を使用して SYMOPT_NO_UNQUALIFIED_LOADS を有効にします。
  4. 手順 2. を繰り返します。 デバッガーは、読み込まれたモジュールのみを検索して存在しないシンボルを検索し、タスクをはるかに高速に完了する必要があります。
  5. SYMOPT_DEBUGを無効にするには、.symopt-0x80000000 または !sym quiet デバッガー拡張機能コマンドを使用します。

デバッガーがシンボルを読み込んで使用する方法を制御するには、いくつかのオプションを使用できます。 シンボル オプションの完全な一覧とその使用方法については、Windows 用デバッグ ツールで提供されるオンライン ドキュメントの「シンボル オプションの設定」を参照してください。 Debugging Tools for Windows パッケージの最新リリースは、Web から無料でダウンロードできます。または、Windows DDK、プラットフォーム SDK、またはカスタマー サポート診断 CD からパッケージをインストールできます。

あなたは何をすべきですか?

  • シンボル検索を高速化するには、可能な限りブレークポイントとデバッガー コマンドで修飾名を使用します。 既知のモジュールのシンボルを表示する場合は、モジュール名で修飾します。シンボルの場所がわからない場合は、修飾されていない名前を使用します。 ローカル変数と関数引数の場合は、モジュール名として $ を使用します (例: $!MyVar)。
  • シンボルの読み込みが遅い原因を診断するには、-n コマンド ライン オプションを使用するか、デバッガーが既に実行されている場合は .symopt+0x80000000 または !sym ノイズ デバッガー拡張機能コマンドを使用して、ノイズシンボルの読み込み (SYMOPT_DEBUG) をアクティブにします。
  • デバッガーがアンロードされたモジュールでシンボルを検索できないようにするには、-snul コマンド ライン オプションを使用してSYMOPT_NO_UNQUALIFIED_LOADSをアクティブ化するか、デバッガーが既に実行されている場合は .symopt+ 0x100 を使用します。
  • デバッグ セッションに必要なモジュールを明示的に読み込むには、 .reloadld などのデバッガー コマンドを使用します。

こちらもご覧ください

WDK をダウンロードする

Windows 用デバッグ ツール

Windows デバッグの概要