Visual Studio 调试器中的 C++ 格式说明符
你可以使用格式说明符更改在“监视”、“自动”和“局部变量”窗口中显示的值所用的格式。
还可在“即时”窗口、“命令”窗口、跟踪点甚至源窗口中使用格式说明符。 如果将鼠标悬停在这些窗口中的某个表达式上,结果将在数据提示中显示。 “数据提示”显示格式说明符。
注意
在 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 h |
十六进制整数 | 102 | 0xcccccccc |
X H |
十六进制整数 | 102 | 0xcccccccc |
xb hb |
十六进制整数(没有前导 0x) | 102 | cccccccc |
Xb Hb |
十六进制整数(没有前导 0x) | 102 | CCCCCCCC |
b | 无符号二进制整数 | 25 | 0b00000000000000000000000000011001 |
bb | 无符号二进制整数(没有前导 0b) | 25 | 00000000000000000000000000011001 |
e | 科学记数法 | 25000000 | 2.500000e+07 |
g | 科学记数或浮点(以较短者为准) | 25000000 | 2.5e+07 |
c | 单个字符 | 0x0065 | 101 'e' |
s | const char* 字符串(加引号) | <location> "hello world" | "hello world" |
sb | const char * 字符串(无引号) | <location> "hello world" | hello world |
s8 | UTF-8 字符串 | <location> "This is a UTF-8 coffee cup ☕" | "This is a UTF-8 coffee cup ☕" |
s8b | UTF-8 字符串(无引号) | <location> "hello world" | hello world |
su | Unicode(UTF-16 编码)字符串(加引号) | <location> L"hello world" | L"hello world" u"hello world" |
sub | Unicode(UTF-16 编码)字符串(无引号) | <location> L"hello world" | hello world |
bstr | BSTR 二进制字符串(加引号) | <location> L"hello world" | L"hello world" |
env | 环境块(双空终止字符串) | <location> L"=::=::\\" | L"=::=::\\\0=C:=C:\\windows\\system32\0ALLUSERSPROFILE=... |
s32 | UTF-32 字符串(加引号) | <location> U"hello world" | u"hello world" |
s32b | UTF-32 string (no quotation marks) | <location> U"hello world" | hello world |
en | enum | Saturday(6) | 星期六 |
hv | 指针类型 - 指示被检查的指针值是数组的堆分配的结果,如 new int[3] 。 |
<location>{<first member>} | <location>{<first member>, <second member>, ...} |
na | 取消指向对象的指针的内存地址。 | <location>, {member=value...} | {member=value...} |
nd | 仅显示基类信息,忽略派生的类 | (Shape*) square 包括基类和派生类信息 |
仅显示基类信息 |
hr | HRESULT 或 Win32 错误代码。 HRESULT 不再需要此说明符,因为调试器会自动对其进行解码。 | S_OK | S_OK |
wc | 窗口类标志 | 0x0010 | WC_DEFAULTCHAR |
wm | Windows 消息数字 | 16 | WM_CLOSE |
nr | 取消“原始视图”项 | ||
nvo | 仅为数字值显示“原始视图”项 | ||
! | 原始格式,忽略任何数据类型视图自定义项 | <customized representation> | 4 |
句柄 | 显示有关 win32 句柄的信息 | 0x000000000000009c | 显示有关句柄的有用信息,例如线程 ID 等。 |
注意
如果存在 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 |
c | 单个字符 | <location> | 101 'e' |
s | const char*(加引号) | <location> | "hello world" |
su | const wchar_t* const char16_t*(加引号) |
<location> | L"hello world" |
sub | const wchar_t* const char16_t* |
<location> | hello world |
s8 | const char*(加引号) | <location> | "hello world" |
hr | HRESULT 或 Win32 错误代码。 HRESULT 不再需要此说明符,因为调试器会自动对其进行解码。 |
S_OK | S_OK |
wc | 窗口类标志 | 0x00000040, | WC_DEFAULTCHAR |
wm | Windows 消息数字 | 0x0010 | WM_CLOSE |
! | 原始格式,忽略任何数据类型视图自定义项 | <customized representation> | 4 |
本机和 C++/CLI 代码的 d、e、f、g、h、i、l、m、ma、mb、md、mq、mu、mw 和 u 说明符需要旧调试器,这在 Visual Studio 2022 或更高版本中不受支持。
粗体 的说明符仅支持本地调试和 C++/CLI 代码。 这些说明符需要使用托管兼容模式指定的旧版调试器。
说明符 | 格式 | 原始监视值 | 显示的值 |
---|---|---|---|
d i |
有符号的十进制整数 | 0xF000F065 | -268373915 |
u | 无符号的十进制整数 | 0x0065 | 101 |
o | 无符号的八进制整数 | 0xF065 | 0170145 |
x X |
十六进制整数 | 61541 | 0x0000f065 |
l h |
用于 d、i、u、o、x、X 的 long 或 short 前缀 | 00406042 | 0x0c22 |
f | 带符号的浮点 | (3./2.), f | 1.500000 |
e | 有符号的科学计数法 | (3.0/2.0) | 1.500000e+000 |
g | 带符号的浮点或有符号的科学计数法, 取其中较短者 |
(3.0/2.0) | 1.5 |
c | 单个字符 | <location> | 101 'e' |
s | const char*(加引号) | <location> | "hello world" |
su | const wchar_t* const char16_t*(加引号) |
<location> | L"hello world" |
sub | const wchar_t* const char16_t* |
<location> | hello world |
s8 | const char*(加引号) | <location> | "hello world" |
hr | HRESULT 或 Win32 错误代码。 HRESULT 不再需要此说明符,因为调试器会自动对其进行解码。 |
S_OK | S_OK |
wc | 窗口类标志 | 0x00000040, | WC_DEFAULTCHAR |
wm | Windows 消息数字 | 0x0010 | WM_CLOSE |
! | 原始格式,忽略任何数据类型视图自定义项 | <customized representation> | 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 | 双字节字符 (Unicode) | 0x0012ffac | 0x0012ffac 8478 77f4 ffff ffff 0000 0000 0000 0000 |
指针的大小说明符,并且指针在使用 C++/CLI 进行的互操作调试中作为数组存在
如果有一个指针指向要看做数组形式的对象,则可以使用一个整数来指定数组中元素的数量。
说明符 | 格式 | 表达式 | 显示的值 |
---|---|---|---|
n | 十进制整数 | pBuffer[32] | 将 pBuffer 显示为 32 个元素的数组。 |