Выражения в отладчике Visual Studio

В состав отладчика Visual Studio входят вычислители выражений, которые работают при вводе выражения в диалоговое окно Быстрая проверка , окно Контрольные значения или окно Интерпретация . Вычислители выражений также работают в окне точки останова и многих других местах в отладчике.

В следующих разделах описываются ограничения на вычисление выражений для языков, поддерживаемых Visual Studio.

Выражения F# не поддерживаются

Выражения F# не распознаны. При отладке кода F# необходимо перевести выражения в синтаксис C# перед вводом этих выражений в окно отладчика или диалоговое окно. Выполняя перевод выражений F# в синтаксис C#, помните, что в C# в качестве оператора проверки равенства используется == , а в F# — одинарный знак =.

Выражения C++

Информацию об использовании операторов контекста с выражениями в C++ см. в разделе Context Operator (C++).

Неподдерживаемые выражения в C++

Конструкторы, деструкторы и преобразования

Нельзя вызывать конструктор или деструктор для объекта, явно или неявно. Например, следующее выражение вызывает конструктор явным способом, что приводит к сообщению об ошибке:

my_date( 2, 3, 1985 )

Невозможно вызвать функцию преобразования, если назначение преобразования является классом. Такое преобразование включает создание объекта. Например, если myFraction — экземпляр класса CFraction, в котором определен оператор функции преобразования FixedPoint, то следующее выражение вызовет ошибку:

(FixedPoint)myFraction

Не удается вызвать новые или удалить операторы. Например, следующее выражение не поддерживается:

new Date(2,3,1985)

Макросы препроцессора

Макросы препроцессора не поддерживаются в отладчике. Например, если константа VALUE объявлена следующим #define VALUE 3образом, вы не можете использовать VALUE в окне "Контрольные значения ". Чтобы обойти это ограничение, заменяйте #defineперечислениями и функциями, где это возможно.

Объявления пространства имен using

Нельзя использовать using namespace объявления. Чтобы обратиться к имени типа или переменной вне текущего пространства имен, необходимо использовать полное имя.

Анонимные пространства имен

Анонимные пространства имен не поддерживаются. Если у вас есть следующий код, вы не можете добавить test в окно просмотра:

namespace mars
{
    namespace
    {
        int test = 0;
    }
}
int main()
{
    // Adding a watch on test doesn't work.
    mars::test++;
    return 0;
}

Использование встроенных функций отладчика для сохранения состояния

С помощью встроенных функций отладчика можно вызывать некоторые функции C/C++ в выражениях, не изменяя при этом состояние приложения.

Встроенные функции отладчика:

  • Гарантированно обеспечить безопасность: выполнение встроенной функции отладчика не повреждает отлаживаемый процесс.

  • Допускается во всех выражениях, даже в сценариях, когда побочные эффекты и оценка функций не допускаются.

  • Работа в сценариях, когда обычные вызовы функций недоступны, например отладка мини-dump.

    Кроме того, встроенные функции отладчика могут сделать вычисление выражений более удобным. Например, в качестве условия останова намного удобнее использовать выражение вида strncmp(str, "asd") , чем выражение str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Площадь Встроенные функции
Длина строки strlen, wcslen, strnlen, wcsnlen
Сравнение строк strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
Поиск строки strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Для этих функций требуется, чтобы отлаживаемый процесс выполнялся в Windows 8. Для отладки файлов дампа, сгенерированных устройством Windows 8, также необходимо, чтобы компьютер Visual Studio работал под управлением Windows 8. В то же время, если устройство Windows 8 отлаживается удаленно, допускается работа компьютера Visual Studio под управлением Windows 7.
WindowsGetStringLen и WindowsGetStringRawBuffer используются только механизмом выполнения (EE) на исходном уровне.
Разное __log2 — возвращает основание журнала 2 указанного целого числа, округленное до ближайшего меньшего целого числа.

__findNonNull — ищет массив указателей, возвращая индекс первого ненулевого элемента.
— Параметры: (1) Указатель на первый элемент массива (void*), (2) Размер массива (без знака int).
— Возвращаемые значения: (1) Индекс, отсчитываемый от 0, первого непустого элемента массива или -1, если он не найден.

DecodeHString — вспомогательная функция для форматирования значения HSTRING. Извлекает значение HSTRING из стека, выталкивает байты структуры StringInfo, которую EE может использовать с целью определения местонахождения строки. Это используется только внутренне EE; Он недоступен пользователю для прямого вызова.

DecodeWinRTRestrictedException — декодирует ограниченное исключение WinRT для получения ограниченного описания.
– Параметры: (1) символы строки с завершающим нулем, представляющей ограниченную ссылочную строку.
– Возвращаемое значение: символы строки с завершающим нулем, содержащей фактическое сообщение об ошибке для отображения.

DynamicCast — реализует dynamic_cast.
– Параметры: (1) указатель на объект для приведения.
– Элементы данных: объект CDynamicCastData должен быть связан как элемент данных с соответствующей инструкцией ExecuteIntrinsic(). Элемент данных кодирует тип, из и в который мы приведение, а также независимо от того, оценивается ли выражение natvis (необходимо для диагностика разрыва бесконечной рекурсии).
— Возвращаемое значение: (1) Указатель на объект, приведение к правильному типу или NULL, если объект, приводимый не является экземпляром правильного типа.

DynamicMemberLookup — вспомогательная функция для динамического получения значения члена класса.

GetEnvBlockLength — вспомогательная функция для получения длины блока среды в символах. Используется для $env.

Stdext_HashMap_Int_OperatorBracket_idx — operator[] для stdext::hash_map. Предполагает хэш-функцию по умолчанию с ключом int. Возвращает значение . Встроенный оператор[] поддерживает только извлечение существующих элементов из хэш-таблицы. Он не поддерживает вставку новых элементов в таблицу, так как это может привести к нежелательной сложности, например выделению памяти. Тем не менее, operator[] может использоваться для изменения значения, связанного с ключом, уже находящимся в таблице.
– Параметры стека: (1) адрес объекта stdext::hash_map, (2) ключ в таблице (int), (3) структура HashMapPdb, которая определяет смещения полей элементов, которые необходимо выполнить в рамках реализации функции для уточняющего запроса. Это необходимо, так как прямой доступ к символам недоступен на удаленной стороне.
– Возвращаемые значения: (1) если ключ находится в таблице, адрес значения, которое соответствует ключу. В противном случае — значение NULL.

Std_UnorderedMap_Int_OperatorBracket_idx — std::unordered_map работает так же, как stdext::hash_map, за исключением того, что хэш-функция отличается.

ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] и operator(index<>)

ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] и operator(tiled_index<>)

ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] и operator(index<>)

ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...)

ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operator[tiled_index<>] и operator(tiled_index<>)

TreeTraverse_Init - инициализирует новый обход дерева.
Поддерживает визуализаторы на основе расширений, а не предназначенные для использования в файлах NATVIS .

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

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

Неподдерживаемые выражения C++/CLI

  • Приведение, включающее указатели или определяемые пользователем приведения, не поддерживаются.

  • Сравнение объектов и назначение не поддерживаются.

  • Перегруженные операторы и перегруженные функции не поддерживаются.

  • Бокс и распаковка не поддерживаются.

  • Sizeof оператор не поддерживается.

Неподдерживаемые выражения C#

Динамические объекты

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

Следующие функции динамических объектов не поддерживаются:

  • составные операторы +=, -=, %=, /=и *=;

  • многие приведения, включая приведения числовых типов и приведения аргументов типа;

  • вызовы методов с более чем двумя аргументами;

  • методы получения свойств с более чем двумя аргументами;

  • методы задания свойств с аргументами;

  • присвоение индексатору;

  • логические операторы && и ||.

Анонимные методы

Создание новых анонимных методов не поддерживается.

Неподдерживаемые выражения Visual Basic

Динамические объекты

В выражениях отладчика можно использовать статически типизированные переменные как динамические. При вычислении в окне "Контрольные значения" объектов, реализующих интерфейс IDynamicMetaObjectProvider, добавляется узел динамического представления. Узел Динамического представления отображает элементы объекта, но не позволяет изменять значения элементов.

Следующие функции динамических объектов не поддерживаются:

  • составные операторы +=, -=, %=, /=и *=;

  • многие приведения, включая приведения числовых типов и приведения аргументов типа;

  • вызовы методов с более чем двумя аргументами;

  • методы получения свойств с более чем двумя аргументами;

  • методы задания свойств с аргументами;

  • присвоение индексатору;

  • логические операторы && и ||.

Локальные константы

Локальные константы не поддерживаются.

Импорт псевдонимов

Псевдонимы импорта не поддерживаются.

Объявления переменных

Не удается объявить явные новые переменные в окнах отладчика. Однако можно присвоить значение новой неявной переменной в окне Интерпретация . Эти неявные переменные область сеанс отладки и недоступны за пределами отладчика. Например, оператор o = 5 неявно создает переменную o и присваивает ей значение 5. Если отладчику не удается определить тип для таких неявных переменных, они имеют тип Object .

Неподдерживаемые ключевые слова

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • Ключевые слова пространства имен или уровня модуля, например End Sub или Module.