VC中的伪寄存器
在VC的集成开发环境中调试程序时,可以在“QuickWatch”、“Watch”窗口中方便地查看和修改变量的取值,也可以进行一些表达式计算,甚至可以在设置断点时使用这些变量生成条件表达式。“Watch”窗口还可以查看VC定义的一些特殊变量,它们被称为伪寄存器(Pseudo Registers)。伪寄存器及其用途参见下表:
伪寄存器 |
说明 |
@ERR |
最近的错误号。也就是GetLastError()的返回值。调试时若想知道一个API调用的返回值,只需在Watch窗口中写上它,而不需要在代码中插入一堆DWORD dwErr = GetLastError(); |
@TIB |
当前线程的线程信息块(Thread Information Block)。 |
@CLK |
时钟寄存器 |
@EAX, @EBX, @ECX, @EDX, @ESI, @EDI, @EIP, @ESP, @EBP, @EFL |
Intel CPU 寄存器 |
@CS, @DS, @ES, @SS, @FS, @GS |
Intel CPU 段寄存器 |
@ST0, @ST1, @ST2, @ST3, @ST4, @ST5, @ST6, @ST7 |
Intel CPU 浮点运算寄存器 |
@HANDLES |
VC++.NET才支持 |
@MM0,@MM1 @MM2,@MM3 @MM4,@MM5 @MM6,@MM7 @MXCSR |
Intel MMX 寄存器 |
我们还可以在“QuickWatch”和“Watch”窗口中使用格式符号来改变变量取值的显示方式。可用的格式符号包括:
符号 |
说明 |
示例取值 |
显示结果 |
d,I |
带符号的整数 |
0xF000F065 |
-268373915 |
U |
不带符号的整数 |
0x0065 |
101 |
o |
不带符号的八进制数 |
0xF065 |
0170145 |
x,X |
十六进制数 |
61541(十进制) |
0x0000F065 |
l,h |
用在d, i, u, o, x, X之前,l表示长整数,h表示短整数 |
00406042,hx |
0x0c22 |
f |
带符号的浮点数 |
3./2. |
1.500000 |
E |
带符号的科学记数法 |
3./2. |
1.500000e+000 |
g |
带符号的浮点数或带符号的科学记数法,采用二者之中较短的一种记法 |
3./2. |
1.5 |
c |
单个字符 |
0x0065 |
'e' |
s |
ANSI字符串 |
0x0012fde8 |
“Hello world” |
su |
UNICODE字符串 |
“Hello world” |
|
st |
ANSI字符串或UNICODE字符串,依赖于文件autoexp.dat中的UNICODE字符串设置 |
||
hr |
HRESULT或WIN32错误码 |
0x00000000L |
S_OK |
wc |
窗口类标记WC_xxx |
0x00000040 |
WC_DEFAULTCHAR |
wm |
Windows消息 |
0x0010 |
WM_CLOSE |
对于指定内存地址中的内容,还可以采用以下的格式符号:
符号 |
说明 |
示例和显示结果 |
ma |
显示64个 ASCII字符 |
0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1 |
m |
以十六进制显示16字节的数据,后面是这16字节对应的ASCII字符 |
0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.. |
mb |
同上 |
0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.. |
mw |
显示8个word |
0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000 |
md |
显示4 个doubleword |
0x0012ffac 00CB34B3 80943084 308A22FF 00002657 |
mq |
显示4个 quadword |
0x0012ffac 7ffdf00000000000 5f441a790012fdd4 |
mu |
显示8个word,常用于显示UNICODE字符 |
0x0012fc60 8478 77f4 ffff ffff 0000 0000 0000 0000 |
在字符数组名称前加上&,可以以字符串的形式显示该数组:&fruit_names。
格式字符同样可以用在表达式后面:
fruit_names[1], mb
count,d
可以使用操作BY, WO, DW查看指定地址或寄存器指向的值。其中BY返回指针指向处一个字节的内容,WO返回指针指向处一个字的内容,DW返回指针指向处一个双字的内容。这些操作可以用在变量、寄存器或常量后。
也可以使用上下文操作{ }来查看指定地址处的内容。
可以在未展开(即变量前面显示的还是+)的结构、数组、指针、对象后使用格式符。如果随后展开该变量,则指定的格式影响所有成员。不能对每个成员指定不同的格式。
在指针变量后用数字n作为格式符,将以数组形式查看指向的地址处的n个数组成员。例如:
ptr,10
参考文献:
1、http://msdn.microsoft.com/library/techart/msdn_vc6mgrtn.htm
2、http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcug98/html/asug_symbols_for_watch_variables.asp
3、http://www.highprogrammer.com/alan/windev/visualstudio.html
4、http://www.codeproject.com/debug/pseudoregister.asp