次の方法で共有


.NET でイメージをデバッグしやすくする

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

アンマネージ コードをコンパイルする場合は、IDE スイッチまたはコマンド ライン オプションを設定することで、デバッグ用の実行可能イメージを構成できます。 たとえば、Visual C++ の /Zi コマンド ライン オプションを使用して、デバッグ シンボル ファイル (ファイル拡張子 .pdb) を出力するように要求できます。 同様に、/Od コマンド ライン オプションは、最適化を無効にするようにコンパイラに指示します。 結果のコードの実行速度は遅くなりますが、これが必要な場合はデバッグが簡単です。

.NET Framework マネージド コードをコンパイルする場合、Visual C++、Visual Basic、C# などのコンパイラは、ソース プログラムを共通の中間言語 (CIL) にコンパイルします。 その後、CIL は、実行の直前に、ネイティブ コンピューター コードに JIT コンパイルされます。 アンマネージ コードと同様に、IDE スイッチまたはコマンド ライン オプションを設定することで、デバッグ用の実行可能イメージを構成できます。 また、デバッグ用に JIT コンパイルを構成する方法もほとんど同じです。

この JIT 構成には、次の 2 つの側面があります。

  • 追跡情報を生成するように JIT コンパイラに要求できます。 これにより、デバッガーは CIL のチェーンを対応するコンピューター コードと照合し、ローカル変数と関数引数が格納されている場所を追跡できます。 .NET Framework バージョン 2.0 以降では、JIT コンパイラは常に追跡情報を生成するため、要求する必要はありません。

  • JIT コンパイラに対して、結果のマシン コードを最適化しないように要求できます。

通常、CIL を生成するコンパイラは、指定した IDE スイッチまたはコマンド ライン オプション (/Od など) に基づいて、これらの JIT コンパイラ オプションを適切に設定します。

場合によっては、JIT コンパイラの動作を変更して、生成するマシン コードをデバッグしやすくすることができます。 たとえば、リテール ビルドまたは制御の最適化に関する JIT 追跡情報を生成できます。 初期化 (.ini) ファイルを使用して行うことができます。

たとえば、デバッグするアセンブリが MyApp.exe呼び出された場合、 MyApp.iniという名前のテキスト ファイルを 、MyApp.exeと同じフォルダーに作成できます。このフォルダーには、次の 3 行が含まれます。

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

各オプションの値を 0 または 1 に設定でき、存在しないオプションの既定値は 0 です。 GenerateTrackingInfoを 1 に、AllowOptimizeを 0 に設定すると、デバッグが最も簡単になります。

.NET Framework 2.0 以降では、JIT コンパイラは、 GenerateTrackingInfoの値に関係なく常に追跡情報を生成しますが、 AllowOptimize の値は引き続き有効です。 Ngen.exe (ネイティブ イメージ ジェネレーター) を使用して最適化なしでネイティブ イメージをプリコンパイルする場合は、Ngen.exe の実行時にAllowOptimize=0を含むターゲット フォルダーに .ini ファイルが存在する必要があります。 最適化なしでアセンブリをプリコンパイルした場合は、NGen.exe /uninstall オプションを使用してプリコンパイル済みコードを削除してから、Ngen.exe を再実行してコードを最適化済みとしてプリコンパイルする必要があります。 .ini ファイルがフォルダーに存在しない場合、既定では、コード Ngen.exe 最適化済みとしてプリコンパイルされます。

System.Diagnostics.DebuggableAttributeは、アセンブリの設定を制御します。 DebuggableAttribute には、JIT コンパイラで追跡情報を最適化するか生成するかを制御する 2 つのフィールドが含まれています。 .NET Framework 2.0 以降のバージョンでは、JIT コンパイラは常に追跡情報を生成します。

リテール ビルドの場合、コンパイラは DebuggableAttribute を設定しません。 既定では、JIT コンパイラは、コンピューター コードをデバッグするのが最も困難な最高のパフォーマンスを生成します。 JIT 追跡を有効にするとパフォーマンスが少し低下し、最適化を無効にするとパフォーマンスが大幅に低下します。

DebuggableAttribute は、アセンブリ内の個々のモジュールではなく、一度にアセンブリ全体に適用されます。 したがって、開発ツールは、アセンブリが既に作成されている場合はアセンブリ メタデータ トークン、または System.Runtime.CompilerServices.AssemblyAttributesGoHere というクラスにカスタム属性をアタッチする必要があります。 次に、ALink ツールは、これらの DebuggableAttribute 属性を各モジュールから、それらの属性が含まれるアセンブリに昇格します。 競合が発生した場合、ALink 操作は失敗します。

.NET Framework のバージョン 1.0 では、/clr および /Zi コンパイラ オプションが指定されると、Microsoft Visual C++ コンパイラによって DebuggableAttribute が追加されます。 .NET Framework のバージョン 1.1 では、 DebuggableAttribute をコードに手動で追加するか、 /ASSEMBLYDEBUG リンカー オプションを使用する必要があります。

こちらも参照ください