コードをデバッグしようとしている場合、そのコードが最適化 されていない 場合は簡単です。 コードが最適化されると、コンパイラとランタイムは出力された CPU コードに変更を加えて、実行速度が速くなりますが、元のソース コードへの直接的なマッピングが少なくなります。 マッピングの直接的性が低い場合、デバッガーはローカル変数の値を通知できないことが多く、コードのステップ実行とブレークポイントが期待どおりに動作しない可能性があります。
注
JIT (Just In Time) デバッグの詳細については、 このドキュメントを参照してください。
.NET での最適化のしくみ
通常、リリース ビルド構成では最適化されたコードが作成され、デバッグ ビルド構成では作成されません。
Optimize
MSBuild プロパティは、コードを最適化するようにコンパイラに伝えるかどうかを制御します。
.NET エコシステムでは、コードは 2 段階のプロセスでソースから CPU への命令に変換されます。最初に、C# コンパイラは入力したテキストを MSIL という中間バイナリ形式に変換し、MSIL を .dll ファイルに書き込みます。 その後、.NET ランタイムはこの MSIL を CPU 命令に変換します。 どちらの手順もある程度最適化できますが、.NET ランタイムによって実行される 2 番目の手順では、より重要な最適化が実行されます。
[モジュールの読み込み時に JIT 最適化を抑制する (管理のみ)]オプション
デバッガーは、最適化が有効な状態でコンパイルされた DLL がターゲット プロセス内で読み込まれた場合の動作を制御するオプションを公開します。 このオプションがオフ (既定の状態) の場合、.NET ランタイムが MSIL コードを CPU コードにコンパイルすると、最適化は有効なままになります。 このオプションがオンの場合、デバッガーは最適化を無効にすることを要求します。
[モジュールの読み込み時に JIT 最適化を抑制する (マネージドのみ)] オプションを見つけるには、[ツール>オプション] を選択し、[デバッグ] ノードの下にある [全般] ページを選択します。
[JIT 最適化の抑制] オプションをオンにする必要がある場合
nuget パッケージなどの別のソースから DLL をダウンロードし、この DLL 内のコードをデバッグする場合は、このオプションをオンにします。 抑制を機能させるには、この DLL のシンボル (.pdb) ファイルも見つける必要があります。
ローカルでビルドしているコードのデバッグにのみ関心がある場合は、このオプションをオフのままにすることをお勧めします。場合によっては、このオプションを有効にするとデバッグが大幅に遅くなります。 この速度が低下する理由は 2 つあります。
- 最適化されたコードの実行速度が速くなります。 多くのコードの最適化を無効にしている場合、パフォーマンスへの影響が増える可能性があります。
- マイ コードのみを有効にしている場合、デバッガーは最適化された DLL のシンボルを読み込もうとしません。 シンボルの検索には時間がかかる場合があります。
[JIT 最適化の抑制] オプションの制限事項
このオプションをオンにすると機能 しない 場合は、次の 2 つの状況があります。
既に実行中のプロセスにデバッガーをアタッチしている場合、このオプションは、デバッガーがアタッチされた時点で既に読み込まれたモジュールには影響しません。
このオプションは、ネイティブ コードにプリコンパイル (または ngen'ed) された DLL には影響しません。 ただし、環境変数 'COMPlus_ReadyToRun' を '0' に設定してプロセスを開始することで、事前コンパイル済みコードの使用を無効にできます。 これにより、.NET Core ランタイムに対して、事前コンパイル済みイメージの使用を無効にし、ランタイムに JIT コンパイル フレームワーク コードを強制するように指示します。
.NET Framework を対象としている場合は、環境変数 'COMPlus_ZapDisable' を 追加し、 それを '1' に設定します。
"COMPlus_ReadyToRun": "0"
を設定するには、ファイルの [プロパティ]\launchSettings.js の各プロファイルに追加します。
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:59694/",
"sslPort": 44320
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
}
},
"HttpLoggingSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}