Улучшаем опыт отладки приложений. Часть 2

    • Visual Studio
    • Debugger
    • Tips & Tricks
  • modified:
  • reading: 4 minutes

Хочу поделиться еще набором интересных возможностей отладчика Visual Studio, с которыми я сам недавно познакомился (может и знал о них, но не особо пользовался). Все эти функции давно забытое старое, они существуют уже не одно поколение Visual Studio.

Выполнение выражение при наведении курсором.

В следующем примере можно отобразить значения переменных и выражений, наведя курсор мыши на сами переменные, либо же на знаки + или * в последнем выражение, которое присваивает значение переменной z. Но мало кто знает, что так же можно отобразить выражение из комментария, для этого нужно просто его выделить, и тогда будут взяты по именам переменным значения из текущей области видимости, и отобразится результат:

Перенос breakpoint с condition

Иногда возникает ситуация, что напишешь для какой-нибудь точки остановки специальный непростой condition, да еще и специальное условие, что нужно напечатать, когда это условие выполнится, а потом только понимаешь, что позиция в исходном файле выбрана не верно. И, к сожалению, нельзя мышкой перетащить точку остановки с одного места, на другое. Но этого можно достигнуть через окно "Location...", просто выставите там нужный File / Line / Character, и точка остановки перенесется на новую позицию со всеми условиями:

Выставление condition сразу нескольким breakpoint точкам

Тоже очень частая задача, особенно для меня. Часто, например, приходится отлаживать код, зная, что существует проблема только с одним определенным обрабатываемым значением. Вы знаете, в каких местах может быть проблема, но их несколько и нужно поставить несколько точек остановок с одним и тем же условием. Можно поочередно их выставлять, а можно просто выставить все точки остановки, для этого нужно пойти в окно breakpoints, там уже выделить их все, и при помощи контекстного меню выставить Condition для них:

Кстати, крайне полезное окно. При длительной отладке очень легко помогает справляться с breakpoints.

Окно breakpoints: Import/Export breakpoints

Редко применяемая функция, но когда при необходимости ее вспоминаешь – крайне радуешься ей. Список всех точек остановок можно экспортировать в xml файл, а затем импортировать. Так можно откладывать текущую сессию отладки, либо передать работу другому программисту. Крайне полезная функция. Найти ее очень просто – окно breakpoint, две стрелочки рядом с друг другом на тулбаре этого окна (смотри скриншот сверху).

Labels для breakpoint

Этим, честно говоря, никогда сам не пользовался. Как-то не было уж насколько затяжных сессий отладки, чтобы фильтровать текущие breakpoints по label. Но идея достаточно простая, можно выставлять отдельные Label (Edit Label в контекстном меню для точки остановки) для точек отладки, а затем просто фильтровать их в окне Breakpoints в поле поиска Search.

Когда нужно проследить за объектом

Бывает еще такая задача, что вы откапали проблемный объект в вашем приложении. Нашли, что с ним что-то не то в одном методе, но очень хотели бы поймать его и в другом методе. Для этого, конечно же, можно просто воспользоваться условием obj.Id == <some value>, если у вашего объекта есть идентификатор, а если нет? А есть ли способ проще? Есть. Объекту в текущей сессии отладки можно присвоить object ID, для этого нужно просто при наведении на объект при помощи контекстного меню вызвать Make Object ID:

После этого вы увидите, что после значения объекта будет еще идентификатор формата <number>#, вроде 1#. Этот идентификатор теперь можно использовать в Watch окне, либо в condition для установки точки остановки:

Теперь данная точка остановки сработает только тогда, когда мы получим именно тот объект, которому был назначен идентификатор 1#.

Использование conditional для изменения значения переменных

Это уж точно скрытая функция. Довольно частая ошибка программистов написать if ( x = 10 ) вместо if ( x == 10). C# компилятор, конечно же, не даст вам скомпилировать первое условие, но вот для точки остановки можно указывать в условии именно присвоение, а не проверку. Приводит это к тому, что мы сможем на лету менять значения. Возможность крайне редко нужна, но мне один раз пригодилась.

C# Format Specifiers

В native мире эта возможность намного больше развита, как можно отображать специфичные объекты в окнах отладчика, но и для managed мира существует несколько форматеров. Я бывает, пользуюсь «d» и «h» для того, чтобы не переключать весь контекст отображения числовых значений в decimal, hex, а только для одной переменной. Кстати, переключать этот контекст можно достаточно просто, в том же меню, где и делается Make Object ID (смотри на скриншот выше).

Для первой строки в окне Watch я использовал форматер h, который отображает значение в hex формате.

Удачной отладки и поменьше багов!

See Also