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


Описатели формата для C++ в отладчике Visual Studio

С помощью описателей формата можно изменить формат, в котором значение отображается в окнах Контрольные значения, Видимые и Локальные.

Кроме того, описатели формата можно использовать в окне интерпретации, окне команд, точках трассировки и даже в окнах исходного кода. Если вы приостановите выполнение на выражении в одном из этих окон, результат отобразится в подсказке DataTip. В подсказке по данным указывается описатель формата.

Примечание.

Одновременно с изменением подсистемы отладки в собственном отладчике Visual Studio был добавлен ряд новых описателей формата. Некоторые старые описатели были удалены. Прежний отладчик все еще используется при отладке взаимодействия (то есть смешанной отладке машинного и управляемого кода) с использованием C++/CLI.

Настройка описателей формата

Мы применим следующий пример кода:

int main() {
    int my_var1 = 0x0065;
    int my_var2 = 0x0066;
    int my_var3 = 0x0067;
}

Добавьте переменную my_var1 в окно контрольных значений в процессе отладки, поочередно выбрав элементы Отладка>Окна>Контрольные значения>Контрольное значение 1. Щелкните переменную правой кнопкой мыши и выберите пункт Шестнадцатеричный вывод. Теперь в окне Контрольные значения отобразится значение 0x0065. Чтобы представить это значение в виде символа, а не целочисленного значения, сначала щелкните его правой кнопкой мыши и снимите флажок Шестнадцатеричное отображение. Теперь добавьте описатель символьного формата , c, в колонку Имя после имени переменной. Теперь в столбце Значение отобразится 101 'e'.

Screenshot of the Visual Studio Watch window with one selected line that shows my_var1.c with a value of 101 'e' and a type of int.

Чтобы просмотреть список доступных описателей формата и выбрать из него нужный вариант, добавьте запятую (,) к значению в окне Контрольные значения.

WatchFormatSpecDropdown

Описатели формата

В приведенных ниже таблицах представлены описатели формата, которые можно использовать в Visual Studio. Описатели, выделенные полужирным шрифтом, поддерживаются только для нового отладчика, но не для отладки взаимодействия с использованием C++/CLI.

класса хранения Формат Исходное контрольное значение Отображаемое значение
d Десятичное целое число 0x00000066 102
o Восьмеричное целое число без знака 0x00000066 000000000146
x

ч
шестнадцатеричное целое число 102 0xcccccccc
X

H
шестнадцатеричное целое число 102 0xcccccccc
xb

hb
шестнадцатеричное целое число (без 0x в начале) 102 cccccccc
Xb

Hb
шестнадцатеричное целое число (без 0x в начале) 102 CCCCCCCC
б двоичное целое число без знака 25 0b00000000000000000000000000011001
bb двоичное целое число без знака (без 0b в начале) 25 00000000000000000000000000011001
e экспоненциальное представление 25000000 2.500000e+07
g более короткое экспоненциальное представление или представление с плавающей запятой 25000000 2.5e+07
в один знак 0x0065 101 'e'
s Строка const char* (с кавычками) <расположение> "Здравствуй, мир!" "hello world"
sb Строка const char* (без кавычек) <расположение> "Здравствуй, мир!" Здравствуй, мир!
s8 Строка UTF-8 <расположение> "This is a UTF-8 coffee cup ☕" "This is a UTF-8 coffee cup ☕"
s8b Строка UTF-8 (без кавычек) <расположение> "Здравствуй, мир!" Здравствуй, мир!
su Строка в Юникоде (кодировка UTF-16) (с кавычками) <расположение> L"Здравствуй, мир!" L"Здравствуй, мир!"

u"Здравствуй, мир!"
дочерний объект Строка в Юникоде (кодировка UTF-16) (без кавычек) <расположение> L"Здравствуй, мир!" Здравствуй, мир!
bstr Двоичная строка BSTR (с кавычками) <расположение> L"Здравствуй, мир!" L"Здравствуй, мир!"
env Блок среды (строка, завершающаяся двумя символами null) <расположение> L"=::=::\\" L"=::=::\\\0=C:=C:\\windows\\system32\0ALLUSERSPROFILE=...
s32 Строка UTF-32 (с кавычками) <расположение> U"Здравствуй, мир!" u"Здравствуй, мир!"
s32b Строка UTF-32 (без кавычек) <расположение> U"Здравствуй, мир!" Здравствуй, мир!
en перечисление Суббота(6) Суббота
hv Тип указателя — указывает на то, что проверяемое значение указателя является результатом выделения кучи для массива, например new int[3]. <расположение>{<первый элемент>} <расположение>{<первый элемент>, <второй элемент>, ...}
na Подавляет адрес указателя на объект в памяти. <расположение>, {элемент=значение...} {элемент=значение…}
nd Отображает только данные базового класса без учета производных классов. (Shape*) square включает данные базового и производных классов Отображает только данные базового класса
ч Код ошибки HRESULT или Win32 Этот описатель больше не нужен для значений HRESULT, так как отладчик декодирует их автоматически. S_OK S_OK
wc Флаг класса Window 0x0010 WC_DEFAULTCHAR
wm Номера сообщений Windows 16 WM_CLOSE
nr Игнорировать элемент Raw View
nvo Показать элемент "необработанное представление" только для числовых значений
! Формат raw (необработанные данные), все настройки представлений типов данных не учитываются <настраиваемое представление> 4
Обрабатывать Отображает сведения об маркере Win32 0x000000000000009c Отображает полезную информацию о таких маркерах, как идентификатор потока и т. д.

Примечание.

Если есть описатель формата hv, отладчик пытается определить длину буфера и отобразить число элементов. Так как отладчик не всегда может точно определить размер буфера массива, по возможности следует использовать описатель размера (pBuffer,[bufferSize]) . Описатель формата hv полезен, когда размер буфера нельзя быстро определить.

Описатели размера для указателей как массивов

Если имеется указатель на объект, который требуется просмотреть в виде массива, можно использовать целое число или выражение для указания числа элементов массива.

класса хранения Формат Исходное контрольное значение Отображаемое значение
n Десятичное или шестнадцатеричное целое число pBuffer,[32]

pBuffer,[0x20]
Отображает pBuffer как массив из 32 элементов.
[exp] Допустимое выражение C++, результатом которого является целое число. pBuffer,[bufferSize] Отображает pBuffer как массив bufferSize элементов.
expand(n) Допустимое выражение C++, результатом которого является целое число. pBuffer, expand(2) Отображает третий элемент pBuffer

Описатели формата для отладки взаимодействия с использованием C++/CLI

класса хранения Формат Исходное контрольное значение Отображаемое значение
o Восьмеричное целое число без знака 0xF065 0170145
x

X
шестнадцатеричное целое число 61541 0x0000f065
в один знак <расположение> 101 'e'
s const char* (с кавычками) <расположение> "hello world"
su const wchar_t*

const char16_t* (с кавычками)
<расположение> L"Здравствуй, мир!"
дочерний объект const wchar_t*

const char16_t*
<расположение> Здравствуй, мир!
s8 const char* (с кавычками) <расположение> "hello world"
ч Код ошибки HRESULT или Win32
Этот описатель больше не нужен для значений HRESULT, так как отладчик декодирует их автоматически.
S_OK S_OK
wc Флаг класса Window 0x00000040, WC_DEFAULTCHAR
wm Номера сообщений Windows 0x0010 WM_CLOSE
! Формат raw (необработанные данные), все настройки представлений типов данных не учитываются <настраиваемое представление> 4

Описателям d, e, f, g, h, i, l, m, ma, mb, md, mq, mu, mw и u для машинного кода и кода C++/CLI требовался устаревший отладчик, который не поддерживается в Visual Studio 2022 или более поздних версий.

Описатели, выделенные полужирным шрифтом, поддерживаются только при отладке машинного кода и кода C++/CLI. Для этих описателей требуется устаревший отладчик, заданный с использованием режима совместимости управляемого кода.

класса хранения Формат Исходное контрольное значение Отображаемое значение
дн.

i
Десятичное целое число со знаком 0xF000F065 -268373915
u Десятичное целое число без знака 0x0065 101
o Восьмеричное целое число без знака 0xF065 0170145
x

X
шестнадцатеричное целое число 61541 0x0000f065
l

ч
Префикс длинного или короткого формата для спецификаторов d, i, u, o, x и X 00406042 0x0c22
f Число с плавающей запятой со знаком (3./2.), f 1,500000
e Число в экспоненциальном представлении со знаком (3.0/2.0) 1,500000e+000
g Число с плавающей запятой со знаком или число в экспоненциальном представлении со знаком
(в зависимости от того, какой формат короче)
(3.0/2.0) 1.5
в один знак <расположение> 101 'e'
s const char* (с кавычками) <расположение> "hello world"
su const wchar_t*

const char16_t* (с кавычками)
<расположение> L"Здравствуй, мир!"
дочерний объект const wchar_t*

const char16_t*
<расположение> Здравствуй, мир!
s8 const char* (с кавычками) <расположение> "hello world"
ч Код ошибки HRESULT или Win32
Этот описатель больше не нужен для значений HRESULT, так как отладчик декодирует их автоматически.
S_OK S_OK
wc Флаг класса Window 0x00000040, WC_DEFAULTCHAR
wm Номера сообщений Windows 0x0010 WM_CLOSE
! Формат raw (необработанные данные), все настройки представлений типов данных не учитываются <настраиваемое представление> 4

Описатели формата для расположений памяти в отладке взаимодействия с C++/CLI

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

Описатели, выделенные полужирным шрифтом, поддерживаются только при отладке машинного кода и кода C++/CLI. Для этого требуется устаревший отладчик, заданный с использованием режима совместимости управляемого кода.

Символ Формат Исходное контрольное значение Отображаемое значение
ma 64 знака ASCII 0x0012ffac 0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1
m 16 байт в шестнадцатеричном формате и затем 16 знаков ASCII 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.
mb 16 байт в шестнадцатеричном формате и затем 16 знаков ASCII 0x0012ffac 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.
mw 8 слов 0x0012ffac 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000
md 4 двойных слова 0x0012ffac 0x0012ffac 00CB34B3 80943084 308A22FF 00002657
mq 2 учетверенных слова 0x0012ffac 0x0012ffac 7ffdf00000000000 5f441a790012fdd4
mu 2-байтовые знаки (Юникод) 0x0012ffac 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000

Описатель размера для указателей в виде массивов в отладке взаимодействия с C++/CLI

Если имеется указатель на объект, который требуется просмотреть в виде массива, можно использовать целое число для указания числа элементов массива.

класса хранения Формат Выражение Отображаемое значение
n Десятичное целое число pBuffer[32] Отображает pBuffer как массив из 32 элементов.