Поделиться через


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

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

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

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

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

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

Сведения об использовании операторов контекста с выражениями в C++см. в разделе "Оператор контекста" (C++).

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

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

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

my_date( 2, 3, 1985 )

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

(FixedPoint)myFraction

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

new Date(2,3,1985)

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

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

использование директив пространства имен

Нельзя использовать 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++ в выражениях без изменения состояния приложения.

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

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

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

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

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

Area Встроенные функции
Длина строки 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) на исходном уровне.
Miscellaneous __log2 — возвращает логарифм по основанию 2 от указанного целого числа, округленный до ближайшего меньшего целого числа.

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

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

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

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

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

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

Stdext_HashMap_Int_OperatorBracket_idx — оператор[] для stdext::hash_map. Предполагает хэш-функцию по умолчанию с ключом int. Возвращает значение. Встроенный оператор[] поддерживает только извлечение существующих элементов из хэш-таблицы. Он не поддерживает вставку новых элементов в таблицу, так как это может привести к нежелательной сложности, например выделению памяти. Однако оператор[] может использоваться для изменения значения, связанного с ключом, уже в таблице.
— Параметры стека: (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, в окне наблюдения добавляется динамический узел. Узел Динамического представления отображает элементы объекта, но не позволяет изменять значения элементов.

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

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

  • Многие преобразования типов, включая числовые преобразования и преобразования с использованием аргументов типов.

  • Вызовы метода с более 2 аргументами

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

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

  • Присвоение значения индексатору

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

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

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

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

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

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

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

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

  • Многие преобразования типов, включая числовые преобразования и преобразования с использованием аргументов типов.

  • Вызовы метода с более 2 аргументами

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

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

  • Присвоение значения индексатору

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

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

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

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

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

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

Не удается объявить явные новые переменные в окнах отладчика. Однако в окне Immediate можно назначить новые неявные переменные. Эти неявные переменные ограничены сеансом отладки и недоступны за пределами отладчика. Например, оператор 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.