Visual studio отладка памяти
С помощью встроенного в отладчик средства диагностики Использование памяти вы сможете находить утечки памяти и выявлять ее неэффективное использование. С помощью средства "Использование памяти" можно сделать один или несколько снимков управляемой и собственной памяти в куче, чтобы понять влияние использования памяти типов объектов. Анализировать использование памяти также можно без подключения отладчика — нужно просто указать выполняющееся приложение. Дополнительные сведения см. в разделе Запуск средств профилирования с отладчиком или без него. Сведения о выборе необходимого средства анализа памяти см. в разделе Выбор инструмента для анализа памяти.
Хотя с помощью средства Использование памяти можно делать снимки памяти в любой момент, для управления выполнением приложения во время анализа ошибок производительности вы можете использовать отладчик Visual Studio. Задание точек останова, пошаговое выполнение, всеобщее прерывание и другие действия отладчика могут помочь вам сосредоточиться на анализе производительности при обращении к наиболее важным ветвям кода. Выполняя эти действия, когда приложение запущено, вы сможете исключить влияние не интересующего вас кода и значительно ускорить диагностику проблем.
В этом руководстве рассмотрены следующие задачи:
- Создание моментальных снимков с данными об использовании памяти
- Анализ данных использования памяти
Если средство Использование памяти не предоставляет необходимые данные, можно воспользоваться другими средствами профилирования в Профилировщике производительности, предоставляющими другие виды информации, которая может оказаться полезной. Как правило, проблемы производительности приложения могут вызываться другими компонентами помимо памяти, такими как ЦП, отрисовка пользовательского интерфейса или время запроса сети.
Поддержка пользовательского распределителя. Профилировщик внутренней памяти работает путем сбора данных событий ETW выделения памяти, создаваемых во время выполнения. Распределители в CRT и пакете Windows SDK аннотированы на уровне исходного кода, что позволяет регистрировать их данные выделения. Если вы создаете собственные распределители, любые функции, возвращающие указатель на только что выделенную память в куче, можно декорировать с использованием __declspec(allocator), как показано в этом примере для myMalloc:
__declspec(allocator) void* myMalloc(size_t size)
Сбор данных об использовании памяти
Откройте проект для отладки в Visual Studio и установите точку останова в приложении в точке, где вы хотите начать проверку использования памяти.
Если вы подозреваете, что в определенной области памяти может возникнуть проблема, задайте первую точку останова до ее возникновения.
Так как из-за изменений в объеме выделяемой памяти создание профиля памяти для интересующей вас операции может быть затруднительно, разместите точки останова в начале и в конце операции или пройдите по ней, чтобы попробовать найти точку, в которой объем памяти изменился.
Установите вторую точку останова в конце функции или области кода, который требуется проанализировать, либо после возникновения предполагаемой проблемы с памятью.
Окно Средства диагностики появится автоматически, если вы не отключали эту функцию. Чтобы снова открыть окно, щелкните Отладка > Окна > Показать средства диагностики.
На панели инструментов выберите Использование памяти, применяя параметр Выбор средств.
Щелкните Отладка | Начать отладку (Запустить на панели инструментов или F5).
По завершении загрузки приложения отображается представление "Сводка" средств диагностики.
Поскольку сбор данных об использовании памяти может повлиять на производительность отладки приложений, основанных на машинном коде, а также смешанных программ, по умолчанию снимки памяти выключены. Чтобы включить моментальные снимки для приложений на базе машинного кода или для смешанных программ, начните сеанс отладки (клавиша: F5). Когда отобразится окно Средства диагностики, перейдите на вкладку Использование памяти и выберите Профилирование кучи.
Остановите (сочетание клавиш: SHIFT+F5) и перезапустите отладку.
Поскольку сбор данных об использовании памяти может повлиять на производительность отладки приложений, основанных на машинном коде, а также смешанных программ, по умолчанию снимки памяти выключены. Чтобы включить моментальные снимки для приложений на базе машинного кода или для смешанных программ, начните сеанс отладки (клавиша: F5). Когда отобразится окно Средства диагностики, перейдите на вкладку Использование памяти и выберите Профилирование кучи.
Остановите (сочетание клавиш: SHIFT+F5) и перезапустите отладку.
Чтобы сделать моментальный снимок в начале сеанса отладки, на сокращенной панели инструментов Использование памяти выберите команду Сделать снимок. (Таким образом здесь также можно задать точку останова.)
Чтобы получить базовые показатели для сравнения состояния памяти, сделайте снимок в начале сеанса отладки.
Запустите сценарий, который вызвал срабатывание первой точки останова.
После приостановки отладчика на первой точке останова на сокращенной панели инструментов Использование памяти выберите команду Сделать снимок.
Нажмите клавишу F5, чтобы запустить приложение до второй точки останова.
Теперь создайте еще один моментальный снимок.
На этом этапе можно начать анализировать данные.
Анализ данных использования памяти
В строках сводной таблицы "Использование памяти" приводятся моментальные снимки, сделанные во время сеанса отладки, и ссылки на дополнительные подробные представления.
Если сделать несколько снимков, в каждой строке сводной таблицы будет отображаться разница значений с предыдущим снимком.
Чтобы выполнить анализ данных об использовании памяти, щелкните одну из ссылок, которая позволяет открыть подробный отчет об использовании памяти:
- Чтобы отобразить подробности об изменении текущего моментального снимка по сравнению с предыдущим, щелкните ссылку разницы слева от стрелки (). Красная стрелка обозначает, что объем используемой памяти увеличился, а зеленая — что он снизился.
Чтобы быстрее выявить проблемы с памятью, типы объектов в отчетах об изменениях можно отсортировать по наибольшему увеличению общего объема (щелкните ссылку "Изменения" в столбце Объекты (разн.) ) или по наибольшему увеличению размера кучи (щелкните ссылку "Изменения" в столбце Размер кучи (разн.) ).
Чтобы отобразить подробности только для выбранного моментального снимка, щелкните ссылку "Без изменений".
Отчет отображается в новом окне.
Отчеты об управляемых типах
Щелкните текущую ссылку в ячейке Объекты (разн.) или Выделения (разн.) в сводной таблице "Использование памяти".
В дереве Объекты, на которые указывает ссылка отображаются ссылки, активные для выбранного в верхней области типа.
В дереве Типы, на которые указывает ссылка отображаются ссылки, активные для выбранного в верхней области типа.
Чтобы отобразить экземпляры типа, выбранного в верхней области, нажмите кнопку "Просмотреть экземпляры" рядом с типом объекта.
На панели Экземпляры , которая открывается в верхней области, отображаются экземпляры выбранного объекта текущего снимка. На панелях Пути к корню и Объекты, на которые указывает ссылка отображаются объекты, которые ссылаются на выбранный экземпляр, а также типы, на которые ссылается выбранный экземпляр. Если создать снимок после остановки отладчика и навести указатель мыши на ячейку в столбце Значение, во всплывающей подсказке отобразятся значения объекта.
Отчеты о собственных типах
Щелкните текущую ссылку в ячейке Выделения (разн.) или Размер кучи (разн.) в сводной таблице "Использование памяти", отображаемой в окне Средства диагностики.
В окне Экземпляры отображаются все экземпляры выбранного типа. При выборе экземпляра на панели Стек вызовов выделений отображается стек вызовов, использованный для создания этого экземпляра.
В окне Экземпляры отображаются все экземпляры выбранного типа. При выборе экземпляра на панели Стек вызовов выделений отображается стек вызовов, использованный для создания этого экземпляра.
Чтобы отобразить стек вызовов для выбранного типа, в раскрывающемся меню Режим просмотра выберите пункт Представление стеков .
Чтобы отобразить стек выделений для выбранного типа, выберите Стеки.
Отчеты об изменениях
В окне Средства диагностики щелкните в необходимой ячейке сводной таблицы Использование памяти разницу в значениях.
Выберите моментальный снимок в списке Сравнить с , в котором отображаются управляемые или собственные отчеты.
С помощью отчета об изменениях в основной отчет можно добавить столбцы, помеченные надписью (Разн.) , в которых будет отображаться разница между двумя выбранными снимками. Отчет об изменениях собственных типов может выглядеть следующим образом.
Блоги и видео
Следующие шаги
В этом руководстве вы узнали, как собирать и анализировать данные об использовании памяти. Если вы уже ознакомились с общими сведениями о профилировщике, можно перейти к анализу данных об использовании ЦП в приложениях.
Во время отладки в окне Память отображается используемая приложением область памяти.
В окнах отладчика, таких как Контрольные, Видимые, Локальные, и в диалоговом окне Быстрая проверка отображаются переменные, которые хранятся в определенных областях памяти. Окно Память показывает более полную картину. Такое представление памяти может быть полезно при анализе больших частей данных (например, буферов или больших строк), которые плохо отображаются в других окнах.
В окне Память могут отображаться не только данные. В нем может отображаться все, что находится в области памяти, включая данные, код или случайные биты мусора из свободного участка памяти.
Окно Память недоступно для отладки скриптов и SQL. Эти языки не распознают концепцию памяти.
Открытие окна "Память"
Как и другие окна отладчика, окна Память доступны только во время сеанса отладки.
Чтобы включить окна Память, необходимо выбрать параметр Включить отладку на уровне адреса в разделе Сервис > Параметры (или Отладка > Параметры) > Отладка > Общие.
Открытие окна "Память"
Убедитесь, что в разделе Сервис > Параметры (или Отладка > Параметры) > Отладка > Общие выбран параметр Включить отладку на уровне адреса.
Запустите отладку, щелкнув зеленую стрелку, нажав клавишу F5 или выбрав команду Отладка > Начать отладку.
В разделе Отладка > Windows > Память выберите Память 1, Память 2, Память 3 или Память 4. (Некоторые выпуски Visual Studio предлагают только одно окно Память.)
Перемещение по окну "Память"
Адресное пространство компьютера велико, и вы можете легко потерять нужное место при прокрутке окна Память.
Старшие адреса памяти отображаются в нижней части экрана. Для просмотра старших адресов следует прокрутить экран вниз. Для просмотра младших адресов следует прокрутить экран вверх.
Чтобы принудительно выполнить немедленное повторное вычисление выражения в поле Адрес, выберите значок Автоматический пересчет.
По умолчанию окно Память обрабатывает выражения Адрес как динамические выражения, которые вычисляются повторно по мере выполнения приложения. Динамические выражения могут быть удобны, например, для просмотра участка памяти, на который ссылается переменная-указатель.
Использование перетаскивания для перемещения к области памяти:
Выберите в любом окне отладчика адрес памяти или переменную-указатель, содержащую адрес памяти.
Перетащите адрес или указатель в окно Память. Этот адрес появляется в поле Адрес, а окно Память изменяется, чтобы отобразить этот адрес в верхней части.
Перемещение к участку памяти путем его ввода в поле "Адрес":
- Введите или вставьте адрес или выражение в поле Адрес и нажмите клавишу ВВОД или выберите значение в раскрывающемся списке в поле Адрес. Окно Память изменяется, чтобы отобразить этот адрес в верхней части.
Настройка окна "Память"
По умолчанию содержимое памяти отображается в виде шестнадцатеричных однобайтовых целых чисел, а ширина окна определяет количество отображаемых столбцов. Можно настроить способ отображения содержимого памяти в окне Память.
Изменение формата содержимого памяти:
- Щелкните правой кнопкой мыши в окне Память и выберите нужные форматы в контекстном меню.
Изменение числа столбцов в окне "Память":
- Щелкните стрелку раскрывающегося списка рядом с полем Столбцы и выберите число отображаемых столбцов или выберите Авто для автоматической подгонки по ширине окна.
Если требуется, чтобы содержимое окна Память не изменялось при выполнении приложения, можно отключить вычисление динамических выражений.
Включение или выключение вычисления в режиме реального времени:
Щелкните правой кнопкой мыши в окне Память и выберите в контекстном меню пункт Автоматический пересчет.
Вычисление динамических выражений представлено переключателем и по умолчанию включено, поэтому при выборе Автоматический пересчет оно отключается. Чтобы снова включить его, выберите Автоматический пересчет.
Можно скрывать или отображать панель инструментов в верхней части окна Память. Когда панель инструментов скрыта, поле Адрес и другие инструменты недоступны.
Переключение отображения панели инструментов:
- Щелкните правой кнопкой мыши в окне Память и выберите в контекстном меню пункт Показать панель инструментов. Панель инструментов появится или исчезнет, в зависимости от своего предыдущего состояния.
Отслеживание указателя в памяти
В приложениях машинного кода можно использовать имена регистров в качестве динамических выражений. Например, можно использовать указатель стека для отслеживания стека.
Отслеживание указателя в памяти:
В поле Адрес окна Память введите выражение указателя, которое находится в текущей области. В зависимости от языка может возникнуть необходимость в ее разыменовании.
Нажмите клавишу ВВОД.
При использовании команды отладки, такой как Шаг, адрес памяти, отображаемый в поле Адрес и в верхней части окна Память, автоматически изменяется при изменении указателя.
В примере, описанном в этой статье, проблема заключается в том, что приложение не отвечает на запросы своевременно.
Открытие дампа памяти в Visual Studio
Откройте дамп памяти в Visual Studio с помощью команды меню Файл > Открыть > Файл и выберите дамп памяти.
Обратите внимание, что на странице сводки дампа памяти в разделе Действие отображается пункт Выполнить диагностический анализ.
Выберите это действие, чтобы запустить отладчик и открыть новую страницу Диагностический анализ со списком доступных параметров анализатора, упорядоченных по базовым симптомам.
Выбор и выполнение анализаторов для дампа
Для изучения этих симптомов в разделе Скорость реагирования процесса доступны варианты, которые наиболее точно соответствуют проблеме в нашем примере.
Анализатор представит результаты на основе сведений о процессе и данных CLR, полученных в дампе памяти.
Просмотр результатов анализатора
В нашем примере анализатор обнаружил две ошибки. Выберите результат анализатора, чтобы просмотреть сводку анализа и предлагаемое исправление.
В разделе Сводка анализа указано, что пул потоков CLR испытывает нехватку ресурсов. Согласно этой информации предполагается, что среда CLR использовала все доступные потоки пула потоков. Это означает, что служба не сможет отвечать на новые запросы, пока поток не будет освобожден.
Исправление в нашем примере — это рекомендация не выполнять синхронное ожидание мониторов, событий, задач или других объектов, которые могут блокировать поток, и проверить, можно ли обновить метод как асинхронный.
Переход к проблемному коду
Следующим заданием является поиск проблемного кода.
Когда вы щелкнете ссылку Показать стек вызовов, Visual Studio немедленно переключится на потоки, которые демонстрируют это поведение.
В окне Стек вызовов отобразятся методы, которые могут быстро отличить пользовательский код (SyncOverAsyncExmple. ) от кода платформы (System. ).
Каждый кадр стека вызовов соответствует методу. Когда вы дважды щелкнете кадр стека, Visual Studio перейдет к коду, выполнение которого приводит непосредственно к описанному сценарию в этом потоке.
В нашем примере нет символов или кода, но на странице Символы не загружены можно выбрать вариант Декомпилировать исходный код .
В декомпилированном источнике ниже асинхронная задача (ConsumeThreadPoolThread) вызывает синхронную блокирующую функцию.
Метод DoSomething() содержит метод WaitHandle.WaitOne, который блокирует текущий поток пула потоков до получения сигнала.
Чтобы ускорить реагирование приложений, важно снять блокировку синхронного кода из всех асинхронных контекстов.
Утечки памяти представляют собой наиболее незаметные и сложные для обнаружения ошибки в приложениях C/C++. Утечки памяти появляются в результате неправильного освобождения выделенной памяти. Небольшая утечка памяти сначала может остаться незамеченной, но постепенно может приводить к различным симптомам: от снижения производительности до аварийного завершения приложения из-за нехватки памяти. Приложение, в котором происходит утечка памяти, может использовать всю доступную память и привести к аварийному завершению других приложений, в результате чего может быть непонятно, какое приложение отвечает за сбой. Даже безобидная утечка памяти может быть признаком других проблем, требующих устранения.
Отладчик Visual Studio и библиотека времени выполнения C (CRT) позволяют обнаруживать и выявлять утечки памяти.
Включение обнаружения утечек памяти
Основным средством для обнаружения утечек памяти является отладчик C/C++ и отладочные функции кучи библиотеки времени выполнения C (CRT).
Чтобы включить все отладочные функции кучи, вставьте в программу C++ следующие операторы в следующем порядке:
Включение файла crtdbg.h сопоставляет функции malloc и free с их отладочными версиями, _malloc_dbg и _free_dbg, которые отслеживают выделение и освобождение памяти. Это сопоставление используется только в отладочных построениях, в которых определен _DEBUG . В окончательных построениях используются первоначальные функции malloc и free .
После того как с помощью этих операторов будут включены отладочные функции кучи, можно поместить вызов _CrtDumpMemoryLeaks перед точкой выхода приложения для отображения отчета об утечке памяти перед завершением работы приложения.
Если приложение имеет несколько выходов, вам не нужно вручную размещать _CrtDumpMemoryLeaks в каждой точке выхода. Для автоматического вызова _CrtDumpMemoryLeaks в каждой точке выхода поместите вызов _CrtSetDbgFlag в начале приложения с помощью следующих битовых полей:
По умолчанию _CrtDumpMemoryLeaks выводит отчет об утечке памяти в область Отладка окна Вывод . Если используется библиотека, она может переустановить вывод в другое расположение.
_CrtSetReportMode можно использовать для перенаправления отчета в другое расположение или обратно в окно вывода, как показано ниже:
Интерпретация отчета об утечке памяти
Если приложение не определяет _CRTDBG_MAP_ALLOC , _CrtDumpMemoryLeaks отображает отчет об утечке памяти, аналогичный следующему:
Если приложение определяет _CRTDBG_MAP_ALLOC , отчет об утечке памяти выглядит следующим образом:
Во втором отчете отображается имя файла и номер строки, в которой впервые было произведено выделение утекающей памяти.
Независимо от того, определен ли _CRTDBG_MAP_ALLOC , в отчете об утечке памяти отображается следующее.
- Номер выделения памяти, в этом примере — 18 .
- Тип блока, в примере — normal .
- Расположение памяти в шестнадцатеричном формате, в этом примере — 0x00780E80 .
- Размер блока, в этом примере — 64 bytes .
- Первые 16 байт данных в блоке, в шестнадцатеричном формате.
Типы блоков памяти: обычные, клиентские или CRT. Обычный блок — это обыкновенная память, выделенная программой. Клиентский блок — особый тип блока памяти, используемой программами MFC для объектов, для которых требуется деструктор. Оператор new в MFC создает либо обычный, либо клиентский блок, в соответствии с создаваемым объектом.
Блок CRT — это блок памяти, выделенной библиотекой CRT для внутреннего использования. Библиотека CRT обрабатывает освобождение этих блоков, поэтому CRT-блоки не будут отображаться в отчете об утечке памяти, если нет серьезных проблем с библиотекой CRT.
Существуют два других типа блоков памяти, которые никогда не отображаются в отчетах об утечке памяти. Свободный блок — это блок памяти, которая была освобождена, поэтому по определению утечки здесь нет. Пропускаемый блок — это память, специально помеченная для исключения из отчета об утечке памяти.
Предыдущие способы выявляют утечки памяти для памяти, выделенной с помощью стандартной функции malloc библиотеки CRT. Однако если программа выделяет память с использованием оператора new C++, то в отчете об утечке памяти вы увидите только имя файла и номер строки, где operator new вызывает _malloc_dbg . Чтобы создать более полезный отчет об утечке памяти, можно написать макрос следующего вида, и в отчете будет указываться строка, в которой было выполнено выделение:
Теперь можно заменить оператор new с помощью макроса DBG_NEW в коде. В отладочных сборках DBG_NEW использует перегрузку глобальных operator new , которая принимает дополнительные параметры для типа блока, файла и номера строки. Перегрузка new вызывает _malloc_dbg для записи дополнительных сведений. Отчеты об утечке памяти показывают имя файла и номер строки, в которой были выделены утечки объектов. Сборки выпуска по-прежнему используют new по умолчанию. Вот пример этого метода:
При выполнении этого кода в отладчике Visual Studio вызов _CrtDumpMemoryLeaks создает отчет в окне вывода, который выглядит аналогичным образом:
Эти выходные данные сообщают о том, что утечка памяти находилась на строке 20 файла debug_new.cpp.
Не рекомендуется создавать макрос препроцессора с именем new или любым другим ключевым словом языка.
Задание точек останова для номера выделения памяти
Номер выделения можно использовать для того, чтобы задать точку останова в том месте, где выделяется память.
Установка точки останова для выделения памяти с помощью окна контрольных значений:
Установите точку останова рядом с началом приложения и запустите отладку.
Когда приложение приостанавливается в точке останова, откройте окно Контрольные значения, последовательно выбрав пункты Отладка > Windows > Контрольные значения 1 (или Контрольные значения 2, Контрольные значения 3 или Контрольные значения 4).
В окне Контрольные значения введите _crtBreakAlloc в столбце Имя.
Если используется многопоточная версия DLL-библиотеки CRT (параметр /MD), добавьте контекстный оператор: _crtBreakAlloc
Убедитесь, что отладочные символы загружены. В противном случае _crtBreakAlloc будет отображаться как неидентифицированный.
Нажмите клавишу ВВОД.
Отладчик выполнит оценку вызова и поместит результат в столбец Значение . Это значение будет равно –1, если в местах выделения памяти не задано ни одной точки останова.
В столбце Значение замените отображаемое значение номером выделения памяти, на котором нужно приостановить выполнение.
После задания точки останова для номера выделения памяти можно продолжить отладку. Убедитесь, что соблюдаются те же условия, чтобы номер выделения памяти не изменился. Когда выполнение программы будет приостановлено на заданном выделении памяти, с помощью окна Стек вызовов и других окон отладчика определите условия выделения памяти. Затем можно продолжить выполнение программы и проследить, что происходит с этим объектом и почему выделенная ему память освобождается неправильно.
Иногда может быть полезно задать точку останова по данным на самом объекте. Для получения дополнительной информации см. раздел Использование точек останова.
Точки останова для выделения памяти можно также задать в коде. Можно установить следующие значения:
Сравнение состояний памяти
Другая технология для обнаружения утечек памяти включает получение "снимков" состояния памяти приложения в ключевых точках. Чтобы получить снимок состояния памяти в заданной точке приложения, создайте структуру _CrtMemState и передайте ее функции _CrtMemCheckpoint .
Функция _CrtMemCheckpoint поместит в структуру снимок текущего состояния памяти.
Чтобы вывести содержимое структуры _CrtMemState , передайте ее функции _ CrtMemDumpStatistics :
Функция _ CrtMemDumpStatistics выводит дамп состояния памяти, который выглядит примерно таким образом:
Чтобы определить, произошла ли утечка памяти на отрезке кода, можно сделать снимок состояния памяти перед ним и после него, а затем сравнить оба состояния с помощью функции _ CrtMemDifference :
Функция _CrtMemDifference сравнивает состояния памяти s1 и s2 и возвращает результат в ( s3 ), представляющий собой разницу между s1 и s2 .
Еще один способ поиска утечек памяти заключается в размещении вызовов _CrtMemCheckpoint в начале и конце программы с последующим использованием _CrtMemDifference для сравнения результатов. Если _CrtMemDifference показывает утечку памяти, можно добавить дополнительные вызовы функции _CrtMemCheckpoint , чтобы разделить программу с помощью двоичного поиска, пока не будет найден источник утечки.
Ложные срабатывания
During debugging, the Memory window shows the memory space your app is using.
Debugger windows like Watch, Autos, Locals, and the QuickWatch dialog show you variables, which are stored at specific locations in memory. The Memory window shows you the overall picture. The memory view is convenient for examining large pieces of data (buffers or large strings, for example) that don't display well in the other windows.
The Memory window isn't limited to displaying data. It displays everything in the memory space, including data, code, and random bits of garbage in unassigned memory.
The Memory window isn't available for script or SQL debugging. Those languages don't recognize the concept of memory.
Open a Memory window
Like other debugger windows, the Memory windows are available only during a debugging session.
To enable the Memory windows, Enable address-level debugging must be selected in Tools > Options (or Debug > Options) > Debugging > General.
To open a Memory window
Make sure Enable address-level debugging is selected in Tools > Options (or Debug > Options) > Debugging > General.
Start debugging by selecting the green arrow, pressing F5, or selecting Debug > Start Debugging.
Under Debug > Windows > Memory, select Memory 1, Memory 2, Memory 3, or Memory 4. (Some editions of Visual Studio offer only one Memory window.)
Move around in the Memory window
The address space of a computer is large, and you can easily lose your place by scrolling in the Memory window.
Higher memory addresses appear at the bottom of the window. To view a higher address, scroll down. To view a lower address, scroll up.
To force immediate re-evaluation of an expression in the Address field, select the rounded-arrow Reevaluate Automatically icon.
By default, the Memory window treats Address expressions as live expressions, which are re-evaluated as the app runs. Live expressions can be useful, for example, to view the memory that is touched by a pointer variable.
To use drag and drop to move to a memory location:
In any debugger window, select a memory address, or a pointer variable that contains a memory address.
Drag and drop the address or pointer in the Memory window. That address then appears in the Address field, and the Memory window adjusts to display that address at the top.
To move to a memory location by entering it in the Address field:
- Type or paste the address or expression in the Address field and press Enter, or choose it from the dropdown in the Address field. The Memory window adjusts to display that address at the top.
Customize the Memory window
By default, memory contents appear as 1-byte integers in hexadecimal format, and the window width determines the number of columns shown. You can customize the way the Memory window shows memory contents.
To change the format of the memory contents:
- Right-click in the Memory window, and choose the formats that you want from the context menu.
To change the number of columns in the Memory window:
- Select the drop down arrow next to the Columns field, and select the number of columns to display, or select Auto for automatic adjustment based on window width.
If you do not want the contents of the Memory window to change as your app runs, you can turn off live expression evaluation.
To toggle live evaluation:
Right-click in the Memory window, and select Reevaluate Automatically in the context menu.
Live expression evaluation is a toggle, and is on by default, so selecting Reevaluate Automatically turns it off. Selecting Reevaluate Automatically again turns it back on.
You can hide or display the toolbar at the top of the Memory window. You will not have access to the Address field or other tools when the toolbar is hidden.
To toggle the toolbar display:
- Right-click in the Memory window, and select Show Toolbar in the context menu. The toolbar appears or disappears, depending on its previous state.
Follow a pointer through memory
In native code apps, you can use register names as live expressions. For example, you can use the stack pointer to follow the stack.
To follow a pointer through memory:
In the Memory window Address field, enter a pointer expression that is in the current scope. Depending on the language, you might have to dereference it.
Press Enter.
When you use a debug command such as Step, the memory address displayed in the Address field and at the top of the Memory window automatically changes as the pointer changes.
Читайте также: