ページ

2005年6月24日金曜日

Visual Studio のリリースとデバッグの違い

Retail vs Debug settings for C# and VB.NET in Visual Studio より


以下、重要なところを要約。(完全な訳になってるわけではないです。訳が怪しいところもありますし、はしょってるところもあります)


----


Visual Studio の設定をデバッグからリリースに変えると何が変わるの?という件について。
まず、以下のことは C# と VB.NET のプロジェクトに関することである。


IL における主な違いは DebuggableAttribute についてである。v1.1 のこの属性には独立にトグルできる以下の 2つのフラグがある:


TrackDebugInfo:
これは JIT されたコードと IL の間のマッピングを作成することを許可する。これはリリースではパフォーマンス上の理由でオフにされる。


DisableOptimazation:
これは JIT に (JIT が IL をコンパイルする際に) 最適化されたコードを生成すべきか否かを知らせる。私は現時点の IL は変わってないと思う (訳注: JIT によって生成されるコードが同じという意味じゃなくて、リリースだろうがデバッグだろうが IL は同じだけど JIT された結果は違う、という意味だと思う。。。あってるかな?)。


※ PDB の生成はコンパイラの選択だが、普通は DisableOptimization がセットされていると PDB が生成されるだろう。なぜならそれはデバッグしたいであろうときにセットされるものだから。


v2.0 (Whidbey) では以下の若干の違いがある。
TrackDebugInfo はいつもセットされる。なぜなら、リリースをデバッグすることはそれ無しではまったく不可能だし、パフォーマンスの影響はとても小さいから。
DisableOptimization はこれまでと同じ。
あと 2つのフラグが追加されたが、今回の質問にはまったく関係しない (ので略)。


v2.0 (Whidbey) でプロジェクトの設定がリリースかデバッグかによってどう変わるかをまとめると、、、


まず、現時点ではリリースかデバッグがに関わらず同じ IL が作成される。


リリースでは、DebuggableAttribute に JIT が最適化されたネイティブコードが生成するようにセットされる。IL ソース行と C#/VB ソース行のマップの PDB ファイルなどは生成されない。


デバッグでは、DebuggableAttribute に JIT がデバッグ可能なネイティブコードを生成するようにセットされる。IL ソース行と C#/VB ソース行のマップの PDB ファイルが生成される。


※ 私は、VS にリリースビルドであっても PDB を生成させることはできると思う。けれども、どうやってやるのかはしらないし、リリースビルドでデバックするのは大変なのでそんなことをしたがる人があるとは思わない。


だから、デバッグビルドは大きなバイナリができるだろうけど、それは PDB が追加されてるだけである。
また、デバッグビルドの主なパフォーマンスへの影響は JIT によって生成されるネイティブコードがデバッグ可能で、従ってリリースに比べるとほんとに遅いものになるということである。

0 件のコメント:

コメントを投稿