Can.NET исходный код жесткий-код точки останова отладки?
Я ищу способ в .NET (2.0, C# в частности) для исходного кода, чтобы вызвать разрыв отладки, как если бы точка останова была установлена в этой точке, без необходимости помнить, чтобы установить определенную точку останова там в отладчике, и без вмешательства в производственную среду выполнения.
наш код должен проглатывать исключения в производстве, чтобы мы не нарушали клиентское приложение, которое ссылается на нас, но я пытаюсь настроить его так, чтобы такие ошибки появлялись для анализа, если это произойдет быть запущена в отладчике, а в противном случае будет игнорироваться.
моя попытка использовать Debug.Assert(false)
было меньше, чем идеально, и я предполагаю, что Debug.Fail()
будет вести себя так же. Теоретически он не должен иметь никакого эффекта в производстве, и он успешно останавливается при отладке, но по дизайну нет (насколько я могу судить) никакого способа продолжить выполнение, если вы хотите игнорировать эту ошибку, как вы могли бы с фактической точкой останова, и как это было бы в производстве, где мы проглатываем ошибка. Это также, по-видимому, нарушает оценку состояния переменной, потому что отладчик фактически останавливается в собственном системном коде, а не в нашем, поэтому отладочная помощь ограничена. (Может быть, я упускаю какой-то способ вернуться к вещам, чтобы посмотреть на переменные и так далее, где это произошло. ???)
Я надеялся на что-то вроде Debug.Break()
, но он, похоже, не существует (если только не в более поздней версии .NET?), и никаких других Debug
методы кажутся применимыми, любой.
обновление: хотя ответ ctacke является лучшим соответствием тому, что я искал, с тех пор я также обнаружил трюк с отладкой.Assert ()--при запуске в отладчике--приостановите отладчик, перейдите к коду для отладки.Assert call pending (выделен зеленым цветом, потому что он не работает в коде фреймворка) и нажмите Step-Out (shift-F11), затем нажмите Ignore в диалоговом окне assert. Это оставит отладчик приостановлен по возвращении assert (и в состоянии продолжайте выполнение, как если бы оно не произошло, потому что оно было проигнорировано). Могут быть и другие способы сделать то же самое (делает ли повторная попытка это более непосредственно?), но этот способ был интуитивным.
7 ответов:
Вы, наверное, что-то вроде этого:
if(System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();
конечно, это все равно будет скомпилировано в сборке выпуска. Если вы хотите, чтобы он вел себя больше как объект отладки, где код просто не существует в сборке выпуска, то вы можете сделать что-то вроде этого:
[Conditional("DEBUG")] void DebugBreak() { if(System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); }
затем добавьте к нему вызов в своем коде.
однажды я столкнулся с ситуацией, когда это не сработало
System.Diagnostics.Debugger.Break();
но это
System.Diagnostics.Debugger.Launch();
Если вы хотите иметь только одну строку кода вместо 4, обернуть
#if DEBUG if (Debugger.IsAttached) Debugger.Break(); #endif
на
public static class DebugHelper { [DebuggerHidden] [Conditional("DEBUG")] public static void Stop() { if (Debugger.IsAttached) Debugger.Break(); } }
и использовать
DebugHelper.Stop();
DebuggerHiddenAttribute добавляется для предотвращения остановки отладчика на внутреннем коде метода Stop и перехода в метод с помощью F11.
Как насчет того, чтобы просто настроить Visual Studio, чтобы всплывать с отладчиком, даже если вы его проглотите?
этого:
- перейти к отладке - > исключения...
- найти правильное исключение, или добавить его, если это ваш собственный
- установите флажок "брошено" для исключения
Это остановит Visual Studio в том месте, где создается исключение, а не только если оно не обрабатывается.
вы можете увидеть больше информации здесь.