Советы и рекомендации для отладчика Visual Studio для .NET.

Я много лет работаю с отладчиком VS, но время от времени я сталкиваюсь с той особенностью, которую я никогда раньше не замечал, и думаю: "Черт, как я мог это пропустить?" so полезно! "

[Отказ от ответственности: эти советы работают в VS 2005 на проекте С#, не гарантируют более старые воплощения VS или других языков]

Отслеживать экземпляры объектов

Работа с несколькими экземплярами данного класса? Как вы можете рассказать им обособленно? В дни программирования, посвященные сбору мусора, было легко отслеживать ссылки - просто посмотрите на адрес памяти. С .NET вы не можете этого сделать - объекты могут перемещаться. К счастью, просмотр часов позволяет вам щелкнуть правой кнопкой мыши на часах и выбрать "Сделать идентификатор объекта".

просмотр часов http://img403.imageshack.us/img403/461/52518188cq3.jpg

Это добавляет {1 #}, {2 #} и т.д. после значения экземпляра, эффективно давая экземпляру уникальный ярлык. Это выглядит так:

пронумерованный экземпляр http://img383.imageshack.us/img383/7351/11732685bl8.jpg

Метка сохраняется для времени жизни этого объекта.

Значимые значения для наблюдаемых переменных

По умолчанию наблюдаемое значение переменной - это тип. Если вы хотите увидеть его поля, вы должны расширить его, и это может занять много времени (или даже тайм-аут!), Если есть много полей или они что-то осложняют.

Однако некоторые предопределенные типы отображают более значимую информацию:

  • Строки
  • показывают их фактическое содержимое.
  • списки и словари показывают их количество элементов и т.д.

содержательная информация http://img205.imageshack.us/img205/4808/37220487md1.jpg

Было бы неплохо иметь это для моих собственных типов?

Хм...

... некоторое время с .NET Reflector показывает, как легко это можно выполнить с помощью атрибута DebuggerDisplay в моем настраиваемом типе:

[System.Diagnostics.DebuggerDisplay("Employee: '{Name}'")]
public class Employee {
    public string Name { get { ... } }
    ...
}

... повторно запустить и...

ta da! <А3 >

Здесь гораздо больше информации по этому вопросу: MSDN

Перерыв во всех исключениях

... даже те, которые обрабатываются в коде! Я знаю, я такой n00b за то, что не знал об этом с тех пор, как родился, но здесь все равно - может быть, это когда-нибудь поможет кому-нибудь:

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

try {
    runStrangeContraption();
} catch(Exception ex) {
    /* TODO: Will handle this error later */
}

В этих случаях очень удобно находить все исключения. Это можно активировать из Debug > Exceptions... (Ctrl-Alt-E). Установите флажки в столбце "Брошенный" для каждого типа исключения, которое вам нужно.


Это были несколько моментов для меня на лбу. Не могли бы вы поделиться своим?

Ответ 1

Два внутрикодовых трюка:

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

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

Ответ 2

try {
    // do something big
}
catch {
    // breakpoint set here:
    throw CantHappenException("something horrible happened that should never happen.");
}

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

Ответ 3

Вот еще один опрятный трюк, который я узнал:

System.Diagnostics.Debugger.Break()

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

Ответ 4

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

Ответ 6

Несколько из меня

  • Снимите флажок "Включить только мой код" в меню "Сервис- > Параметры- > " Отладка ".
  • Условные точки останова - они спасают мою жизнь почти каждый день.
  • Используйте источник .NET framework, если все становится некрасиво

Ответ 7

.load sos в окне Immediate:)

Ответ 8

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

Tracepoints (и другие функции точки останова... щелкните правой кнопкой мыши на точке останова и получайте удовольствие)! - 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!

Ответ 9

Я нашел окно модулей полезным много раз. Он сообщает, загрузил ли отладчик требуемую DLL и какую версию DLL загружена. Он также позволяет вам вручную загружать или выгружать DLL.

Ответ 10

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

Ответ 11

Двое из меня: один, который, я надеюсь, каждый использует повсюду:

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

Даже если у вас есть Debug, Exceptions, Break on the throw exceptions set, исключения здесь не будут обнаружены.

Ответ 12

Создайте макрос для присоединения к процессу и назначьте неиспользуемую комбинацию клавиш. Гораздо быстрее, чем идти: debug → attach to process → выполнить поиск в списке процессов → ...

Ответ 13

Как насчет того, чтобы IDE разбилась на исключения, когда они происходят, даже если у нас нет набора точек отладки.

Отладка → Исключения → Исключения времени выполнения Commmon Language → Thrown

Это затрудняет поиск скрытых задач обработки исключений. На самом деле это своего рода настройка, которую каждый разработчик должен был бы разработать, чтобы избежать каких-либо неподчиненных или даже обработанных исключений, которые находятся внизу.

Ответ 14

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

Это полезно, если у вас есть некоторая коррупция по адресу knwon (stack/heap vaiable, сбитый).

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

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

Yum!