Подсказки по отладчику Visual Studio и приемы для.NET

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

70
задан Brad Larson 25 September 2017 в 20:52
поделиться

12 ответов

Две уловки в коде:

Мне очень нравится атрибут System.Diagnostics.DebuggerStepThrough ; вы можете прикрепить его к классу, методу или свойству, чтобы VS не вводил код по умолчанию при отладке. Я предпочитаю его атрибуту DebuggerHidden , поскольку он по-прежнему позволит вам ставить точки останова в игнорируемый код, если вам действительно нужно его отлаживать.

Другой (иногда) полезный вызов - System.Diagnostics .Debugger.Launch () ; когда исполнение дойдет до него, вам будет представлено диалоговое окно «выберите отладчик», и отладчик запустится. Немного грубо, но полезно и особенно неприятно для присоединения к процессам, например, процесс, который порождается другим и немедленно выполняет ваш код.

7
ответ дан 24 November 2019 в 13:29
поделиться

Два от меня: тот, что я надеюсь, что все используют повсеместно:

Debug.Assert(<condition>, <message>)

второй DebuggerHidden:

<DebuggerHidden()> _
Public Sub ReadDocumentProperty(ByVal propertyName As String, ByRef PropVal As Integer, ByVal DefaultVal As Integer)
    Try
        Dim prop As Office.DocumentProperty
        prop = CustomProps.Item(propertyName)
        PropVal = CType(prop.Value, Integer)
    Catch
        PropVal = DefaultVal
    End Try
End Sub

, Даже если у Вас есть Отладка, Исключения, Повреждение на наборе вызванных исключительных ситуаций, исключения в здесь не будут пойманы.

2
ответ дан CestLaGalere 24 November 2019 в 13:29
поделиться

Условные разрывы очень полезны, если у Вас есть код, который повторяется много, но только перестал работать под определенным набором условий, таких как код в цикле, методы, названные от цикла или методов, названных от нескольких потоков. Поместите оператор завершения в строку интереса и установите его условия для соответствия ошибочному случаю. (Существует быстрый пример здесь .)

3
ответ дан ARKBAN 24 November 2019 в 13:29
поделиться

Инструменты-> Присоединение К Процессу - легкий забыть, но с ним, я могу отладить сценарий в веб-страницах, управляемый код, загруженный в другом процессе (думают дополнительная модель), или даже неуправляемый код. Будьте осторожны с разрешением ему автоматически выбрать тип отладки, которой Вы интересуетесь.

Точки трассировки (и другие функции точки останова... щелкают правой кнопкой по точке останова и весело проводят время)! - http://blogs.msdn.com/saraford/archive/2008/06/13/did-you-know-you-can-use-tracepoints-to-log-printf-or-console-writeline-info-without-editing-your-code-237.aspx

непосредственное окно является потрясающим.

Удаленная Отладка очень полезна, если Вы развертываете приложения (и может добраться до машины, где проблема может быть воспроизведена).

существуют тонны больше. Попытайтесь войти в WinDbg и SoS!

4
ответ дан David Mohundro 24 November 2019 в 13:29
поделиться

Я нашел окно Modules полезным много времен. Это говорит, загрузил ли отладчик необходимый dll и какая версия dll загружается. Это также позволяет Вам вручную загрузить или разгрузить dll.

4
ответ дан etsuba 24 November 2019 в 13:29
поделиться

Некоторые от меня

  • Снятие флажка опция "Enable Just My Code" в Инструментах-> Опции-> Отладка.
  • Условные точки прерывания - они спасают мою жизнь почти каждый день
  • Использование источник платформы.NET , если вещи становятся ужасными
7
ответ дан Atanas Korchev 24 November 2019 в 13:29
поделиться

Конечно, проверьте совет дня VS:

http://blogs.msdn.com/SaraFord/

9
ответ дан Brian 24 November 2019 в 13:29
поделиться

Я всегда удостоверяюсь, что установил свойство "Name" на новых потоках, которые я создаю. Тот путь, когда я отлаживаю, я могу более легко определить различные потоки.

12
ответ дан Jon Tackabury 24 November 2019 в 13:29
поделиться

Вот другой аккуратный прием, который я изучил:

System.Diagnostics.Debugger.Break()

программно причины отладчик для повреждения на следующей инструкции. действительно хорошая часть, это также работает на программу, скомпилированную в режим Release без отладочной информации.

17
ответ дан Cristi Diaconescu 24 November 2019 в 13:29
поделиться
try {
    // do something big
}
catch {
    // breakpoint set here:
    throw CantHappenException("something horrible happened that should never happen.");
}

, Как Вы видите исключение, которое было первоначально выдано? В окне часов введите $exception

19
ответ дан plinth 24 November 2019 в 13:29
поделиться

.load sos в окне Immediate:)

6
ответ дан leppie 24 November 2019 в 13:29
поделиться

В неуправляемом коде вы можете установить «точки останова по данным».Они используют регистры отладки ЦП для выдачи INT3, и отладчик останавливается на этой инструкции без дополнительных затрат во время выполнения (в более старой версии отладчик прошел через программу, проверяющую память ... медленно!)

Это полезен, если у вас есть повреждения на известном адресе (стека / куча сбиваются).

Также AutoExp.dat в ide \ packages \ debugger может быть настроен для отображения ваших структур данных.

указатель, mb показывает шестнадцатеричный дамп в окне просмотра http://msdn.microsoft.com/en-us/magazine/dd252945.aspx

Ням!

0
ответ дан 24 November 2019 в 13:29
поделиться