System.Diagnostics.Debug.WriteLine в производственном коде - PullRequest
62 голосов
/ 21 октября 2009

Я, наверное, уже должен это знать, но я не уверен и не вижу, что это задокументировано.

Я часто использую System.Diagnostics.Debug.WriteLine в процессе разработки, чтобы иметь возможность отслеживать изменения переменных или исключений при отладке кода. Это сделано для того, чтобы облегчить разработку и понять, что происходит только во время разработки. Обычно я либо закомментирую код, либо удаляю его, когда иду в производство.

Мне интересно, что произойдет, если я забуду закомментировать код. Скажем, например, что во время цикла разработки я отслеживаю информацию об ошибках, которая может записывать строку соединения в окно вывода с помощью строки Debug.Write. Это, конечно, нормально при разработке, но мне интересно, когда я выйду в эфир, есть ли здесь риск. Может кто-нибудь прикрепить отладчик к моему живому исполняемому файлу и перехватить этот вывод? Или это то, что производит только вывод в Visual Studio?

А как быть, когда мы переключаемся с отладки на релиз? Этот код игнорируется компилятором, если мы компилируем его для выпуска?

Ответы [ 6 ]

75 голосов
/ 21 октября 2009

Все члены класса Debug помечены ConditionalAttribute , поэтому сайты вызовов не будут скомпилированы в сборку выпуска.

17 голосов
/ 21 октября 2009

System.Diagnostics.Debug вызовы метода присутствуют только в том случае, если определен символ условной компиляции "DEBUG". По умолчанию символ «DEBUG» определен только для отладочных сборок.

Компиляторы, которые поддерживают ConditionalAttribute игнорировать звонки эти методы, если "DEBUG" не является определяется как условная компиляция символ.

11 голосов
/ 21 октября 2009

Поскольку все методы Debug имеют атрибут [Conditional ("DEBUG")], при переключении с Debug на Release вам не придется беспокоиться об этом, поскольку вызовы этих методов будут удалены (наряду с другие оптимизации сборки выпуска).

7 голосов
/ 21 октября 2009

Отладочная информация видна только когда вы работаете в Режим отладки .В режиме Release операторы Debug не будут видны (вы можете использовать Trace вместо Debug , если хотите, чтобы эти операторы были видны в режиме Release).*

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

2 голосов
/ 21 октября 2009

Если вы компилируете без опции /d:DEBUG или #define DEBUG, ваши вызовы WriteLine не будут физически присутствовать в вашем коде выпуска; никакая третья сторона не может восстановить какую-либо информацию из этих вызовов, поскольку их буквально нет в версии выпуска.

Подробнее здесь: Класс отладки (System.Diagnostics) на MSDN

1 голос
/ 21 октября 2009

Почти все члены Debug помечены условным атрибутом. Такие компиляторы, как C #, будут пропускать вызовы этих методов во время сборки Release, поэтому вы на безопасной стороне.

Информация о режиме здесь: http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.aspx

...