Описатели формата для 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'.
Чтобы просмотреть список доступных описателей формата и выбрать из него нужный вариант, добавьте запятую (,) к значению в окне Контрольные значения.
Описатели формата
В приведенных ниже таблицах представлены описатели формата, которые можно использовать в 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 элементов. |