72

私はおそらくこれをすでに知っているはずですが、よくわかりませんし、文書化されていません。

コードのデバッグ中に変数や例外の変更を追跡できるように、開発プロセス中に System.Diagnostics.Debug.WriteLine を頻繁に使用します。これは、開発を容易にし、開発中に何が起こっているのかを簡単に理解できるようにすることを目的としています。私は通常、コードをコメントアウトするか、本番環境に移行するときに削除します。

コードをコメントアウトするのを忘れたらどうなるのだろうと思っています。たとえば、開発サイクル中に、Debug.Write Line を使用して出力ウィンドウへの接続文字列を記録する可能性のあるエラー情報を追跡しているとします。これは開発中はもちろん問題ありませんが、ライブに行くときは、ここにリスクがあるかどうか疑問に思っています。誰かが私のライブ実行可能ファイルにデバッガーをアタッチして、この出力をトラップできますか? それとも、Visual Studio でのみ出力を生成するものですか?

そして、デバッグからリリースに切り替えるときはどうなるでしょうか? リリース用にコンパイルすると、このコードはコンパイラによって無視されますか?

4

6 に答える 6

89

Debug クラスのすべてのメンバーはConditionalAttributeでマークされているため、呼び出しサイトは Release ビルドにコンパイルされません。

于 2009-10-21T14:00:13.793 に答える
18

System.Diagnostics.Debugメソッド呼び出しは、「DEBUG」条件付きコンパイル シンボルが定義されている場合にのみ存在します。デフォルトでは、「DEBUG」シンボルはデバッグ ビルドに対してのみ定義されます。

ConditionalAttribute「DEBUG」が条件付きコンパイル シンボルとして定義されていない限り、これらのメソッドの無視呼び出しをサポートするコンパイラ 。

于 2009-10-21T13:59:34.717 に答える
13

Debug メソッドにはすべて [Conditional("DEBUG")] 属性があるため、Debug から Release に切り替えると、これらのメソッドへの呼び出しが削除されるため、心配する必要はありません (他の最適化とともに)。リリース ビルドの)。

于 2009-10-21T14:00:34.497 に答える
7

デバッグ情報は、デバッグ モードで実行している場合にのみ表示されます。リリース モードでは、Debug ステートメントは表示されません (これらのステートメントをリリース モードで表示する場合は、 Debugの代わりにTraceを使用できます)。

http://support.microsoft.com/kb/815788

于 2009-10-21T14:06:34.717 に答える
2

/d:DEBUGオプションまたはを指定せずにコンパイルする#define DEBUGと、WriteLine 呼び出しはリリース コードに物理的に存在しません。これらの呼び出しは、文字通りリリース バージョンには存在しないため、第三者がこれらの呼び出しから情報を回復する方法はありません。

詳細はこちら: MSDN のデバッグ クラス (System.Diagnostics)

于 2009-10-21T14:03:20.843 に答える
1

Debug のほとんどすべてのメンバーは、ConditionalAttribute でマークされています。C# などのコンパイラは、リリース ビルド中にこれらのメソッドの呼び出しをスキップするため、安全です。

モード情報はこちら: http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.aspx

于 2009-10-21T14:02:06.260 に答える