少し前に CLR に関する記事を読みました。著者は、プロジェクトが DEBUG モードでコンパイルされている場合、各オペレーターが NOP コマンドを実行する前にコードをデバッグできることを示しました。それにもかかわらず、今日、リリースモードでもデバッグできることを発見しました...違いを理解するのを手伝ってください。
3 に答える
実行中にソース コードをステップ実行できるように .net コードをデバッグするには、通常、次の 3 つのことが必要です。
- アセンブリ .dll または .exe と共にビルドされたシンボル(関連する .pdb ファイル)
- ソース(関連する .cs、.vb などのファイル)
- 実行中のマシン コードは最適化されていない必要があります
シンボルは/debug:{full | pdbonly}フラグ。指定した場合/debug:full
(コンパイラの最適化がオフになっているリリース ビルドでも)、既に実行中のプロセスにアタッチして、コードをステップ実行できます。がある場合は/debug:pdbonly
、デバッガーを使用してプログラムを開始する必要があります (また、既に実行中のプロセスにアタッチするときはシンボルを表示できません)。
最適化は/debugコンパイラ オプションによって細かく制御されますが、 /optimize-によってさらに制御できます。
リリースモードである程度デバッグできます。Debug と Release は単なるビルド構成 (多くの構成を作成できます) です。実際の違いは、Debug 構成では生成されたバイナリ コードが最適化されないことです (最適化されたコードはデバッグを複雑にします)。また、リリースでは生成されない追加のデバッグ データも生成されます。
リリース モードでコンパイルすると、結果として得られるバイナリが最適化されます。これにより、デバッガーがどのバイナリ コードがソース コードのどの行から来たのかを知ることが難しくなります (不可能ではありません)。
デバッグ モードは、デバッガーが「従う」ことを容易にするように設計されているため、コード行を NOP で分離し、結果のバイナリを最適化しません。