Вступление

Мы предполагаем, что читатель знает основы отладки в Visual Studio, но мы углубимся в некоторые основные концепции отладки.

Многие разработчики управляют своими сеансами отладки с помощью этого достаточно мощного набора знаний. Однако инструменты отладки Visual Studio могут предложить гораздо больше. Вот список советов по продуктивности отладки Visual Studio. Обратите внимание, что эти советы и ярлыки были проверены в Visual Studio 2019 16.6 без установленного расширения.

Бежать к курсору

С помощью сочетания клавиш Ctrl + F10 вы можете указать отладчику запускаться до тех пор, пока не появится строка, указанная курсором.

Выполните выполнение здесь простым щелчком мыши

При наведении курсора на исходный код во время отладки Выполнить здесь появляется зеленый глиф. Этот глиф можно щелкнуть.

Установите следующий оператор здесь

Зеленый глиф «Выполнить через здесь» можно преобразовать в оператор set next to here, удерживая клавишу Ctrl. Это отличается от Выполнить здесь, потому что оператор между ними не выполняется. Следовательно, в небольшой анимации ниже мы видим в окне просмотра, что ссылочный объект obj остается нулевым: промежуточный конструктор MyClass не был выполнен.

Попадание в точку останова по данным: при изменении значения

Если вы установите точку останова на установщик нестатических свойств, он будет активирован при изменении значения свойства для всех объектов. Такое же поведение может быть получено для отдельного объекта благодаря щелчку правой кнопкой мыши в локальном (или наблюдаемом) окне: «Прервать при изменении значения в меню».

Это средство проиллюстрировано приведенной выше анимацией. Попадание происходит только при изменении obj2.Prop, а не при изменении obj.Prop.

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

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

Условная точка останова

Условие может быть привязано к точке останова для прерывания только в определенном сценарии. В приведенной ниже анимации мы определяем точку останова с условием I ›6 внутри цикла. Затем мы нажимаем «Продолжить» и видим, что после остановки точки останова Ivalue становится равным 7.

Точка останова трассировки

Прекращение выполнения программы - наиболее частое действие при достижении точки останова. Однако вместо этого вы можете выбрать печать некоторых трассировок в окне Вывод без остановки (или с ней). Эта возможность проиллюстрирована анимацией ниже, где мы отслеживаем значение I от 0 до 9 в окне Вывод. Обратите внимание, что точка останова трассировки имеет форму ромба в канале редактора кода.

Обратите внимание, что для точки останова можно указать как условие, так и действие трассировки.

Отслеживание объекта, ссылка на который выходит за рамки

В Watch оконные объекты отслеживаются по именам их ссылок в текущей выполняемой области. Однако, когда такая отслеживаемая ссылка выходит за пределы области видимости, она становится бессмысленной в контексте окна Watch и отключается, даже если объект, на который указывает ссылка, все еще жив.

Есть много ситуаций, когда мы хотели бы продолжить отслеживание состояния объекта вне области видимости. Для этого щелкните правой кнопкой мыши такую ​​ссылку в окне Watch, щелкните меню Make Object ID и добавьте $ 1 в элементы для наблюдения (или $ 2 или $ 3… в зависимости от того, сколько идентификаторов объектов у вас уже создан).

На анимации ниже показано, как отслеживать состояние средства получения свойств объекта вне области видимости, которое возвращает фактическую дату и время в виде строки. Это хорошо показывает, что когда ссылка obj выходит за пределы области действия в контексте Fct (), отслеживаемый элемент obj отключается и $ 1.Prop все еще обновляется.

Просмотр значения, возвращаемого функцией

Значение, возвращаемое функцией, иногда игнорируется исходным кодом. Или иногда это значение просто недоступно во время отладки.

Такое возвращаемое значение можно отобразить в окнах Отладка ›Windows› Авто. Псевдопеременные $ ReturnValue также можно использовать в окнах Immediate и Watch для просмотра последнего возвращенного значения, вызванного вызовом функции.

Обратите внимание, что меню Отладка ›Windows› Авто доступно только в том случае, если отладчик Visual Studio подключен к процессу и программа остановлена ​​отладчиком.

Подключиться к процессу

Начиная с Visual Studio 2017 предлагается функция Повторное подключение к процессу Shift + Alt + P, и это очень удобно. После присоединения отладчика к процессу Visual Studio запоминает его и предлагает повторно присоединить отладчик к тому же процессу. То же выделено курсивом, потому что здесь есть эвристика относительно идентичности процесса:

  • Если процесс, к которому вы были подключены, все еще активен, Подключить повторно к процессу повторно подключиться к нему.
  • В противном случае Visual Studio пытается найти один процесс с тем же предыдущим именем процесса и повторно подключить к нему отладчик.
  • Если обнаружено несколько процессов с таким именем, открывается диалоговое окно Присоединить к процессу, в котором отображаются только процессы с таким же именем.
  • Если процесс с таким именем не найден, отображается диалоговое окно Присоединить к процессу.

Reattach to Process также работает с сеансами отладки, включающими несколько процессов. В этой ситуации Visual Studio пытается найти все процессы, к которым она была подключена, с помощью эвристики, описанной выше.

Обработка выражения без побочных эффектов

Иногда при оценке выражения в окне Immediate или в окне Watch изменяется какое-то состояние. Такое поведение часто нежелательно, вы не хотите портить состояние вашей отлаженной программы только потому, что вам нужно оценить значение выражения.

Чтобы избежать изменения состояния, вы можете добавить к своему выражению суффикс nse (без побочных эффектов). Эта возможность проиллюстрирована приведенной ниже анимацией (посмотрите, изменяется ли значение _State или нет в окне Watch),

Здесь nse используется в окне Watch. Этот пример менее тривиален, чем предыдущий из-за кнопки оценки Обновить в отслеживаемом элементе SideEffectFct ().

Оценка выражения без побочного эффекта в окне просмотра

Показать темы в исходном коде

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

Дополнительные советы по отладке многопоточных приложений доступны в этой документации Microsoft: Начните отладку многопоточных приложений (C #, Visual Basic, C ++)

Вот исходный код этой небольшой демонстрации, если вы хотите поиграть с ней,

Декомпилировать код IL в исходный код, который можно отлаживать

Часто мы зависим от некоторых компонентов черного ящика: сборок, для которых у нас нет исходного кода.

Однако при отладке сложного поведения удобно наблюдать и даже отлаживать логику, вложенную в указанные черные ящики. Вот почему, начиная с версии 16.5, Visual Studio 2019 может генерировать некоторый исходный код из скомпилированных сборок. Такой исходный код затем можно отлаживать. Эта функция основана на проекте OSS ILSpy.

Меню декомпиляции можно предложить в контекстном меню сборки в окне Модули (как показано на анимации ниже) и в Источник не найден или Нет Символы загружены.

Декомпиляция кода IL в исходный код не может быть идеальной, потому что некоторая исходная информация теряется во время компиляции. Следовательно, эта функция имеет несколько ограничений, описанных в конце этой официальной документации: Генерировать исходный код из сборок .NET во время отладки.

Заключение

Visual Studio великолепна, но особенно хороша, когда дело доходит до отладки. Здесь я попытался выбрать несколько советов, которые оба довольно скрыты, но часто полезны, я надеюсь, что они помогут повысить вашу продуктивность.

….. Продолжай учиться !!!!