Возможно ли отслеживать изменение переменной
Есть ли в студии встроенные средства для отслеживания изменения переменной, что бы отладчик останавливался в момент когда изменилось значение переменной?
Отслеживать
задан 3 окт 2018 в 5:30
user301823 user301823
A breakpoint зачем?
3 окт 2018 в 5:34
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Да, есть — Debug -> NewBreakpoint -> DataBrekpoint .
UPD Наиболее исчерпывающая документация по Data Breakpoint: Visual Studio GDB
Отслеживать
ответ дан 3 окт 2018 в 5:34
915 5 5 серебряных знаков 17 17 бронзовых знаков
Круто, не думал что такие средства вообще есть 🙂 А в Qt , или в gdb что-то подобное есть? (под линуксом)
3 окт 2018 в 6:59
@zcorvid Да, в GDB тоже есть подобный инструмент
3 окт 2018 в 7:04
Прикольная штука, не знал. Правда оказывается только в плюсах есть, а в шарпе нет. И ещё можно только 4 штуки назначить (по крайней мере в 2010 студии). Ответу бесспорно апвоут, но если будет возможность — добавьте ссылку на документацию.
Отображение локальных параметров
В Visual Studio 2015 такая реализация вычислителя выражений была сделана нерекомендуемой. Сведения о реализации вычислителей выражений в среде CLR см. на страницах CLR expression evaluators (Вычислители выражений CLR) и Managed expression evaluator sample (Пример управляемого вычислителя выражений).
Выполнение всегда выполняется в контексте метода, также известного как содержащий метод или текущий метод. При приостановке выполнения Visual Studio вызывает подсистему отладки (DE), чтобы получить список локальных переменных и аргументов, коллективно вызывая локальные локальные параметры метода. Visual Studio отображает эти локальные и их значения в окне «Локальные».
Чтобы отобразить локальные параметры, de вызывает метод GetMethodProperty , принадлежащий EE, и дает ему контекст оценки, то есть поставщик символов (SP), текущий адрес выполнения и объект привязки. Дополнительные сведения см. в контексте оценки. Если вызов выполнен успешно, IDebugExpressionEvaluator::GetMethodProperty метод возвращает объект IDebugProperty2 , представляющий метод, содержащий текущий адрес выполнения.
De вызывает EnumChildren для получения объекта IEnumDebugPropertyInfo2, который фильтруется, чтобы вернуть только локальные значения и перечислить для создания списка DEBUG_PROPERTY_INFO структур. Каждая структура содержит имя, тип и значение локального объекта. Тип и значение хранятся в виде отформатированных строк, подходящих для отображения. Имя, тип и значение обычно отображаются вместе в одной строке окна «Локальные».
Окна quickWatch и Watch также отображают переменные с одинаковым форматом имени, значения и типа. Однако эти значения получаются путем вызова GetPropertyInfo вместо IDebugProperty2::EnumChildren .
В этом разделе
Пример реализации локальных языков использует примеры для пошагового выполнения процесса реализации локальных параметров.
Связанный контент
- Контекст оценки объясняет, что при вызове подсистемы отладки (DE) средство оценки выражений (EE) передает три аргумента.
- Написание вычислителя выражений CLR
Использование окон памяти в отладчике Visual Studio (C#, C++, Visual Basic, F#)
Во время отладки в окне Память отображается используемая приложением область памяти.
В окнах отладчика, таких как Контрольные, Видимые, Локальные, и в диалоговом окне Быстрая проверка отображаются переменные, которые хранятся в определенных областях памяти. Окно Память показывает более полную картину. Такое представление памяти может быть полезно при анализе больших частей данных (например, буферов или больших строк), которые плохо отображаются в других окнах.
В окне Память могут отображаться не только данные. В нем может отображаться все, что находится в области памяти, включая данные, код или случайные биты мусора из свободного участка памяти.
Окно Память недоступно для отладки скриптов и SQL. Эти языки не распознают концепцию памяти.
Открытие окна «Память»
Как и другие окна отладчика, окна Память доступны только во время сеанса отладки.
Чтобы включить окна Память, необходимо выбрать параметр Включить отладку на уровне адреса в разделе Инструменты>Параметры (или Отладка>Параметры) >Отладка>Общие.
Открытие окна «Память»
- Убедитесь, что в разделе Инструменты>Параметры (или Отладка>Параметры) >Отладка>Общие выбран параметр Включить отладку на уровне адреса.
- Запустите отладку, щелкнув зеленую стрелку, нажав клавишу F5 или выбрав команду Отладка>Начать отладку.
- В разделе Отладка>Windows>Память выберите Память 1, Память 2, Память 3 или Память 4. (Некоторые выпуски Visual Studio предлагают только одно окно Память.)
Перемещение по окну «Память»
Адресное пространство компьютера велико, и вы можете легко потерять нужное место при прокрутке окна Память.
Старшие адреса памяти отображаются в нижней части экрана. Для просмотра старших адресов следует прокрутить экран вниз. Для просмотра младших адресов следует прокрутить экран вверх.
Можно мгновенно перейти к указанному адресу в окне Память, используя перетаскивание или введя адрес в поле Адрес. Поле Адрес принимает буквенно-цифровые адреса и выражения, которые при вычислении дают адрес, например e.User.NonroamableId .
Чтобы принудительно выполнить немедленное повторное вычисление выражения в поле Адрес, выберите значок Автоматический пересчет.
По умолчанию окно Память обрабатывает выражения Адрес как динамические выражения, которые вычисляются повторно по мере выполнения приложения. Динамические выражения могут быть удобны, например, для просмотра участка памяти, на который ссылается переменная-указатель.
Использование перетаскивания для перемещения к области памяти:
- Выберите в любом окне отладчика адрес памяти или переменную-указатель, содержащую адрес памяти.
- Перетащите адрес или указатель в окно Память. Этот адрес появляется в поле Адрес, а окно Память изменяется, чтобы отобразить этот адрес в верхней части.
Перемещение к участку памяти путем его ввода в поле «Адрес»:
- Введите или вставьте адрес или выражение в поле Адрес и нажмите клавишу ВВОД или выберите значение в раскрывающемся списке в поле Адрес. Окно Память изменяется, чтобы отобразить этот адрес в верхней части.
Настройка окна «Память»
По умолчанию содержимое памяти отображается в виде шестнадцатеричных однобайтовых целых чисел, а ширина окна определяет количество отображаемых столбцов. Можно настроить способ отображения содержимого памяти в окне Память.
Изменение формата содержимого памяти:
- Щелкните правой кнопкой мыши в окне Память и выберите нужные форматы в контекстном меню.
Изменение числа столбцов в окне «Память»:
- Щелкните стрелку раскрывающегося списка рядом с полем Столбцы и выберите число отображаемых столбцов или выберите Авто для автоматической подгонки по ширине окна.
Если требуется, чтобы содержимое окна Память не изменялось при выполнении приложения, можно отключить вычисление динамических выражений.
Включение или выключение вычисления в режиме реального времени:
-
Щелкните правой кнопкой мыши в окне Память и выберите в контекстном меню пункт Автоматический пересчет.
Примечание. Вычисление динамических выражений представлено переключателем и по умолчанию включено, поэтому при выборе Автоматический пересчет оно отключается. Чтобы снова включить его, выберите Автоматический пересчет.
Можно скрывать или отображать панель инструментов в верхней части окна Память. Когда панель инструментов скрыта, поле Адрес и другие инструменты недоступны.
Переключение отображения панели инструментов:
- Щелкните правой кнопкой мыши в окне Память и выберите в контекстном меню пункт Показать панель инструментов. Панель инструментов появится или исчезнет, в зависимости от своего предыдущего состояния.
Следуйте указателю через память (C/C++)
В приложениях машинного кода можно использовать имена регистров в качестве динамических выражений. Например, можно использовать указатель стека для отслеживания стека.
Отслеживание указателя в памяти:
- В поле Адрес окна Память введите выражение указателя, которое находится в текущей области. В зависимости от языка может возникнуть необходимость в ее разыменовании.
- Нажмите ВВОД. При использовании команды отладки, такой как Шаг, адрес памяти, отображаемый в поле Адрес и в верхней части окна Память, автоматически изменяется при изменении указателя.
Просмотр указателей памяти (.NET)
Если вы хотите просмотреть содержимое объекта .NET на основе указателя памяти, например адреса, полученного из моментального снимка кучи, это можно сделать с помощью @Address нотации. Адрес должен быть указателем на память, например 0x1D102A581B0. Введите указатель памяти, используя @Address нотацию в поле «Адрес памяти«. Кроме того, можно использовать ту же нотацию для добавления часов с помощью окна «Контроль».
Чтобы получить адрес указателя памяти из моментального снимка кучи, откройте дамп кучи, выберите «Отладочная управляемая память», которая открывает средство использования памяти. Щелкните правой кнопкой мыши интересующий объект и выберите «Просмотреть экземпляры«.
Связанный контент
Как просмотреть значение переменной в cshtml при отладке Visual Studio?
Отладка JavaScript-кода внутри cshtml -страницы в среде разработки Visual Studio, насколько мне известно, недоступна. Вы можете поставить Breakpoint на элемент Razor-разметки — там точка останова сработает. И чтобы увидеть значение переменной — Вам необходимо, чтобы Ваш код был активен именно в том месте, где Вы этого хотите. Иными словами, если хотите увидеть в JavaScript-коде, нужно чтобы он в данный момент выполнялся и там была к примеру точка останова.
Для отладки JavaScript-кода на странице, лично я пользуюсь разными подходами. Первые два подхода — с использованием браузера.
1. Использование ключевого слова debugger
Пишем в JavaScript-коде вот такую строку:
debugger; var name = $('#input_price').val();
Пишем эту строку там, где хотим остановиться.
Выражение debugger открывает доступ к любому доступному в конкретном окружении отладочному функционалу, например к установке точек останова (т.н. брейкпоинтов).
Чтобы брейкпоинт сработал (выполнилась приостановка) — нужно открыть исходный код текущей страницы в браузере (к примеру в Google Chrome это пункт Просмотреть код )
2. Использование console.log
Использовать можно в качестве отладочной информации и для дальнейшей инспекции и отладки кода. Довольно-таки банальный способ, но очень действенный. К примеру, я хочу посмотреть, что было в переменной, по Вашему коду:
var name = $('#input_price').val(); console.log(name);
Метод console.log — выводит сообщения в веб-консоль. На подобии предыдущего пункта открываем Просмотреть код , идем на вкладку Console — и видим, что у нас было в переменной name . Просто и действенно. Ну и наконец перейдем к тому, что Вам должно помочь.
3. Перенос JavaScript-кода из .cshtml в отдельный файл .js
Как я сказал в начале: отлаживать Razor на странице внутри Visual Studio — пожалуйста, но не JavaScript. Выносим функционал JavaScript-кода в отдельный файл (к примеру MyCshtml.js ), помещаем его в папку ( Scripts к примеру), где-то рядышком, и подключаем на странице как-то так:
После этой не хитрой манипуляции точки останова в среде разработки должны заработать и Вы сможете увидеть, что у Вас находится в той или иной переменной в Вашем JavaScript-коде в момент отладки определенного кода. Причем сайт нужно открывать в браузере Internet Explorer, именно он дружит с Visual Studio, так как оба продукта от Microsoft.
4. Visual Studio 2017 в паре с Internet Explorer 11 и debugger
Пожалуй, самый банальный способ, как показала практика рассуждений с @Grundy — это использование ключевого слова debugger внутри JavaScript-кода cshtml -страницы.
- Выбираем браузер по умолчанию для открытия нашего сайта Internet Explorer.
- Открываем сайт в IE и переходим в Настройки -> Свойства браузера — вкладка Дополнительно — раздел Обзор , убираем галочку напротив строки: Отключить отладку сценариев (Internet Explorer) , жмем Применить , а затем ОК
После этого точки остановки в месте ключевого слова debugger срабатывают внутри среды разработки Visual Studio 2017.
Проверил на VS2017 в паре с IE11 в операционной системе Windows 10.