VC调试器高级应用----WATCH窗口篇

一.格式化数据和表达式赋值语句.

常用变量格式化符(表达式的值后跟逗号,接格式化符,如"(int)0xFFFF,d"):
d  :有符号的十进制数.
u  :无符号的十进制数.
o  :无符号的八
x,X:十六进制数.
d,i,u,o,x,X的长前缀或短前缀.
f  :有符号浮点数.
e  :有符号的科学计数法.
g  :有符号的浮点或有符号的科学计数法,用其中较短的一个.
c  :单字符.
s  :字符串.
su :双字节字符串.
st :双字节字符串或ANSI字符串,取决于AUTOEXP.DAT中的Unicode String设置.
hr :Windows类标记.
wm :Windows消息码.

常用内存转储对象的格式化符(用法同变量格式化符):
ma :64个ASCII码字符.
m  :以16进制书写的16字节,后跟16个ASCII字符.
mb :以16进制书写的16字节,后跟16个ASCII字符.
mw :8个字长.
md :4个双精度字.
mq :4个四倍字长的字.
mu :2字节字符(Unicode标准).
#  :将指针扩展到指定的数值数目的内存存储单元上.(#代表一个数字)

WATCH窗口允许重新设置数据变量的格式,
如:可用BY,DW表达式来定位指针的偏移量;
可用&和*运算符,且两运算符都可直接操作内存地址;
甚至可用上下说明符明确指定变量的上下文.
总之,所有格式化方法和指定方法在WATCH窗口都有效

WATCH窗口是一个完整的表达式求值程序,可以在其中查看任何条件语句.

表达式中可用的伪寄存器(可当普通变量进行查看):
@ERR:最后一个错误值,GetLastError API返回相同的值.
@TIB:当前线程的线程信息块.(调试器不能处理"FS:0"格式).
@CLK:时钟寄存器.
@EAX,@EBX,@ECX,@EDX,@ESI,@EDI,@DIP,@ESP,@EBP,@EFL
    :Intel CPU寄存器.
@CS,@DS,@ES,@SS,@FS,@GS
    :Intel CPU段寄存器.
@ST0,@ST1,@ST2,@ST3,@ST4,@ST5,@ST6,@ST7
    :Intel CPU浮点寄存器.

二.适时编码

许多时候只想对两断点间的执行时间有个大致印象,可用@CLK得出两断点间所需执行时间(包括调试器占用的时间).
需要输入两个@CLK观察符,第一个是@CLK,第二个是@CLK=0.第二个的目的是重新运行时将定时器清0.
时间以微秒为单位,大多数情况下需要格式化为毫秒:"@CLK/1000,d".

三.在WATCH窗口中调用函数

大多数情况下用于执行专门编写的校验数据结构,保证数据的相关性的函数.在释放构件中,从未调用过的函数不会被链接,因此不必担心这类函数会对影响发布构件.
如函数没有参数,也要求使用括号"()",调用时像用普通函数一样传送参数.WATCH右边将显示函数返回值.
这里有些限制:
1.只能在一个单线程上下文中执行函数.如是多线程程序,将函数输入到WATCH窗口中检查结果后应立即从WATCH窗口清除,否则,如调试函数在第二个线程上下文中执行,会立即终止第二个线程的运行.
2.调试函数必须在20秒内执行.如执行过程中出现异常,程序会在调试器中中止.
3.(常识)只对数据验证进行内存读取,如有问题,调用OutputDebugString类的函数.如更改内存或调用API函数----尽管这是可能的,但无法预知可能会发生什么.
只要在WATCH窗口中重新计算表达式,已输入WATCH窗口的调试函数就会执行:
.程序处于运行状态并触发某一断点时.
.单步调试某一代码行或某一指令时.
.在WATCH窗口左边编辑完成调试函数的文本并按下回车时.
.在运行程序时出现异常情况,并让你返回调试器中时.
使用调试函数的建议:输入调试函数并查看值后,立即从WATCH窗口清除;只为最关键的数据结构编写调试函数;不要更改个别结构的转储内像.

四.自动扩展自己的类型

常见的自动扩展是RECT,输入RECT型的变量后直接显示其中的某些数据成员的值.
自定义类型扩展时,只需将自己的类型入口加入<VS Common>\MSDev98\Bin目录的AUTOEXP.DAT文件中.
例:
扩展CreateProcess()所用到的PROCESS_INFORMATION结构
1.检查调试器将该类型识别为什么.将PROCESS_INFORMATION变量输入WATCH窗口,右击变量,选择Properties,在这里它被标注为_PROCESS_INFORMATION类型.
2.打开AUTOEXP.DAT文本文件,加入扩展入口.语法如下:
Type=[text]<member[format]>
本例中要查看hProcess和hThread值,故输入:
_PROCESS_INFORMATION=hProcess=<hProcess,X> hThread=<hThread,X>
其中X表示以16进制查看.有个特殊的格式化符<,t>,用于通知调试器输入最易派生类型的类型名.如B派生至A,只有B有自动扩展规则,则B的自动扩展将会是后面跟随着类A的自动扩展规则的类型名B.

五.Set Next Statement命令

可以在调试时从菜单运行,但也可在WATCH窗口中直接设置EIP寄存器----小心,可能很容易摧毁程序.在最优化的释放构件中,最安全的方法是在Disassembly窗口中使用该命令.如代码在堆栈上创建了临时变量,更要多加小心.
最常用的情况是:在出问题的函数前设置一个断点,检查进入的参数,单步调试整个函数;如问题不是重复的,使用Set Next Statement设置返回到断点的执行点,并更改参数.这样可在一个调试会话中测试多个假设,节省测试时间,但它不能用于所有场合,因为函数执行会破坏其状态.
另一个常用地点是测试时填充数据结构,如表和数组,可用它输入额外的数据并查看代码如何处理--当某些数据条件难于复制时更为方便.

拾遗:

1.数组指针显示

int *block;

在watch窗口查看block,看到的是block的地址

用block[0],只能看到一个值

可以用   block,10    来同时查看多个值

用(&block[2]),6  可以查看block[2]到[7]

2 hr使用:

$err,hr 显示lasterror的返回错误代码。

23,hr 0x00000017 数据错误(循环冗余检查)。

参考网页:

http://bbs.csdn.net/topics/50110658

http://www.2cto.com/kf/201202/119593.html

http://blog.csdn.net/lingyin55/article/details/6600447

随机推荐

  1. BZOJ1901 - Dynamic Rankings(树状数组套主席树)

    题目大意 给定一个有N个数字的序列,然后又m个指令,指令种类只有两种,形式如下: Q l r k 要求你查询区间[l,r]第k小的数是哪个 C i t  要求你把第i个数修改为t 题解 动态的区间第k ...

  2. Worker工作者进程

  3. mysql 不支持innodb的问题解决

    在新的机器上安装了mysql后,发现里面新创建的数据表的存储引擎都是myisam,于是 执行下面语句,把mysiam改为innodb. alter table tbl_test engine=inno ...

  4. 安装、配置JDK的步骤

    1.配置环境变量,打开我的电脑--属性--高级--环境变量,新建系统变量JAVA_HOME .变量值:jdk的目录,比如d:/java.选择“系统变量”中变量名为“Path”的环境变量双击该变量,把J ...

  5. CSS3:clip-path具体解释

    我的一个学生,Heather Banks,想要实现他在Squarespace看到的一个效果: 依据她的以往经验,这个站点的HTML和CSS是全然在她的能力范围以内,于是我帮助她完毕了这个效果.显示na ...

  6. SQL Server将一列的多行内容拼接成一行的问题讨论

    转自http://blog.csdn.net/rolamao/article/details/7745972 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出 ...

  7. android96 内存创建图片副本,画画板

    package com.itheima.copy; import android.os.Bundle; import android.app.Activity; import android.grap ...

  8. 标准I/O库之定位流

    有三种方法定位标准I/O流. (1)ftell和fseek函数.这两个函数自V7以来就存在了,但是它们都假定文件的位置可以存放在一个长整型中. (2)ftello和fseeko函数.Single UN ...

  9. ODB 下载与安装 (Linux)

    http://www.codesynthesis.com/products/odb/download.xhtml Installing ODB on UNIX Introduction This gu ...

  10. TCPDUMP Command Examples

    tcpdump command is also called as packet analyzer. tcpdump command will work on most flavors of unix ...