Глубокий взгляд на отладку памяти

Глубокий взгляд на отладку памяти

25 января 2023 г.

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

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

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

Расшифровка

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

Профилировщик и отладчик

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

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

Просмотр памяти с возможностью поиска

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

Но это только часть истории. Когда мы перешагиваем, происходят выделения. Мы можем увидеть разницу между текущей точкой и предыдущей, когда посмотрим на столбец diff. Обратите внимание, что когда я говорю «точка», я имею в виду либо предыдущую строку с переходом, но это также может относиться к нажатию «продолжить» между двумя точками останова. В этом случае я вижу, что строка, которую я перешагнул, вызвала выделение 70-байтовых массивов. Может показаться, что это много, но среда IDE не может различать потоки и глубокий граф вызовов, поэтому нам нужно отнестись к цифре с долей скептицизма.

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

Обновить загруженные классы

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

Отслеживание новых экземпляров

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

После включения мы видим небольшой значок часов рядом с отслеживаемым объектом, но по мере того, как мы продолжаем выполнение, задействовано гораздо больше. Теперь я вижу только объекты, выделенные в этом diff. Мы можем точно понять, что произошло с оперативной памятью, в мельчайших деталях. Обратите внимание, что здесь я вижу точное количество элементов, которые были выделены здесь. Их было много, потому что я сделал длинную паузу, ожидая, прежде чем перешагнуть. Нажав кнопку «Показать новые экземпляры», я получу специальную версию диалогового окна экземпляров.

В этой версии диалога я вижу только новые созданные экземпляры. Среда IDE точно знает, какие объекты были созданы между последней остановкой в ​​точке останова и настоящим моментом. Он показывает мне только эти объекты. Для каждого из отдельных объектов. Я вижу трассировку стека, которая запускала его, вплоть до буквального вызова new!

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

Переход и контрольные точки

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

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

Заключительное слово

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


Также опубликовано здесь


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