Выражения в отладчике 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
.