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. Kafka系列(一)安装和配置说明

    单机模式 修改kafak安装文件中 .../kafka_2.9.2-0.8.1.1/config 下面的server.properties 配置文件 1.broker.id=0   [默认不用修改,该 ...

  2. 【原创】Hadoop机架感知对性能调优的理解

    Hadoop作为大数据处理的典型平台,在海量数据处理过程中,其主要限制因素是节点之间的数据传输速率.因为集群的带宽有限,而有限的带宽资源却承担着大量的刚性带宽需求,例如Shuffle阶段的数据传输不可 ...

  3. iOS xcodebuild 打包app

    1.传统的app打包(没有使用cocopods) 在打包之前,先把证书和配置文件选好. step1:打开终端,cd 进入到工程目录中 step2:xcodebuild clean(如果buid文件存在 ...

  4. Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011 2013 解决办法

    Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynam ...

  5. 联通超级战舰W910 Root 后不能 上网 解决方案

    联通版的超级战舰w910root后不能上网,一下是root方法: 超级战舰W910 Root方法: 电脑上安装“刷机精灵”(http://www.shuame.com/ ),在手机“菜单”——“系统设 ...

  6. Centos6.3建立FTP

    2014年2月22日 16:54:20 1. 安装ftp     yum install vsftpd ftp 2. 编辑/etc/vsftpd/vsftpd.conf     chroot_list ...

  7. 什么是Scale Up和Scale Out?

    导读:Scale Out(也就是Scale horizontally)横向扩展,向外扩展 Scale Up(也就是Scale vertically)纵向扩展,向上扩展 无论是Scale Out,Sca ...

  8. MyEclipse x.x各版本终极优化配置指南

    先说优化:随着myeclipse版本不断更新,其功能不断强大,更加智能及人性化,为开发人员提供了很多便利.提高了开发速度,但是也牺牲了性能,让很多机器配置稍差的开发人员头疼不已.其实我们平时常用的功能 ...

  9. ActiveMQ, Qpid, HornetQ and RabbitMQ in Comparison

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. jstl前台Jsp日期格式化

    1. 引入fmt标签 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %&g ...