Отладка как старший разработчик: смотрите и оценивайте

Отладка как старший разработчик: смотрите и оценивайте

21 декабря 2022 г.

Это была невероятно насыщенная неделя. Новый канал YouTube, на котором размещен курс, стремительно набирает подписки; это только вступает в свою 3-ю неделю...

веб-сайт курса запущен; вы можете увидеть весь курс там, хотя я постоянно добавляю видео и сделал примерно 1/3 работы.

Сейчас у него 3 часа 17 минут контента. У меня готов добавить еще один час контента, и я работаю над еще несколькими. Я почти уверен, что курс будет длиться более 6 часов, когда он будет завершен.

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

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

https://www.youtube.com/watch?v=DGjVVKCNosM?embedable=true

Расшифровка

Добро пожаловать в третью часть отладки в Scale, где мы научимся искать ошибки, как профессионалы!

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

Область просмотра – это область внизу экрана.

В IntelliJ мы также можем вставлять выражения наблюдения рядом с кодом. Часы — одна из важнейших возможностей отладчика. Вот как мы можем видеть, что происходит в отладчике.

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

Возвращаемое значение

Вы когда-нибудь возвращались из метода только для того, чтобы подумать: "Что вернул этот метод?"

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

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

Оценить

Вычисление выражения — одна из замечательных функций отладчика, которой мы недостаточно пользуемся.

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

Если вам нужно смоделировать что-то, что трудно протестировать в текущем коде, это место, где вы можете поиграть с платформой и проверить «дикие теории».

Это очень похоже на REPL, который есть в более новых версиях Java, но во многих отношениях лучше, потому что мы можем выполнять код в контексте нашего приложения.

Если у меня есть метод, который возвращает неправильное значение, я часто копирую вызов в диалог оценки и пробую различные комбинации вызова, чтобы увидеть, «что работает».

Просто попробовав все варианты без перезагрузки, мы сэкономим много времени!

Вы можете запустить это диалоговое окно с помощью комбинации клавиш Alt-F8.

Смотреть

Возможность просмотра в IntelliJ просто впечатляет.

IntelliJ позволяет встроить часы непосредственно в редактор IDE, выбрав «Добавить встроенные часы» в контекстном меню. Насколько мне известно, это замечательная функция, уникальная для JetBrains.

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

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

Изменить состояние

Установить значение — это функция, которую я часто забываю использовать при отладке.

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

Мы также можем использовать F2 для ускорения

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

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

Мы можем объединить эту возможность с переходом к строке, который мы обсуждали ранее, и протестировать метод с помощью множества различных перестановок. Даже те, которые не могут быть воспроизведены нормально. Хорошим примером может быть код, который у меня есть, который работает только в Windows. Но у меня Mac.

Я просто меняю значение статической переменной, которая указывает на текущую операционную систему, и тестирую этот код.

Маркировка объектов

Маркировка объектов — одна из самых крутых функций, которые мы обсудим в этом курсе, и о ней почти ничего не известно.

Это немного тонко; сначала мы добавим наблюдение за Thread.currentThread(), которое возвращает экземпляр объекта, представляющий текущий поток.

Как видите, я вижу текущий поток в часах.

Теперь я могу запускать этот метод снова и снова и видеть текущий поток; всегда ли метод выполняется из одного и того же потока?

Ну, я могу посмотреть на идентификатор потока, и да. Это то же самое. Таким образом, это, вероятно, потокобезопасно. Но как мне это проверить?

Обычно я записываю идентификатор объекта или указатель переменной на лист бумаги и проверяю, совпадает ли это значение. Это боль и не масштабируется. Как часто я могу нажимать «Продолжить» снова и снова?

В контекстном меню я выбираю «Отметить объект» и ввожу произвольное имя. MyThread в этом случае, как только я это сделал, я могу нажать OK

Это заменяет значение текущего потока прямо сейчас новой меткой. Таким образом, мы можем ошибочно предположить, что это просто имя для выражения наблюдения. Это не так. Мы объявили новую переменную и дали ей имя MyThread.

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

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

Но это становится намного лучше…

Давайте добавим к этому методу точку останова, совершенно стандартную точку останова, как мы делали раньше.

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

Увеличим масштаб.

Давайте введем условие; Я могу сравнить MyThread с текущим значением потока. Обратите внимание, что это условие будет вести себя соответствующим образом, поскольку значение MyThread не зависит от исходного оператора наблюдения Thread.currentThread().

Таким образом, если текущий поток действительно отличается, точка останова остановится в этой точке.

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

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

Я часто использую это с API-интерфейсами, такими как JPA, где иногда у нас могут быть два экземпляра объекта с одним и тем же идентификатором. Это действительно трудно обнаружить. Просто отметьте один объект, и вы сразу увидите, что это другой экземпляр.

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

Наконец-то

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

Если у вас есть какие-либо вопросы, пожалуйста, используйте раздел комментариев. Спасибо!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE