watch窗口语法规则|vc watch窗口查看指针指向的数组

本文介绍VC调试器Watch窗口的高级使用技巧,包括查看指针数组、格式化数据、适时编码、调用函数及自定义类型扩展等。适用于深入理解调试器功能及提高调试效率。
watch窗口语法规则|vc watch窗口查看指针指向的数组
2009-04-19 20:16

假设
int *block;
在watch窗口查看block,看到的是block的地址
用block[0],只能看到一个值
可以用   block,10    来同时查看多个值
用(&block[2]),6 可以查看block[2]到[7]

watch窗口语法规则
一.格式化数据和表达式赋值语句.
  
常用变量格式化符(表达式的值后跟逗号,接格式化符,如"(int)0xFFFF,d"):
d,I:有符号的十进制数.
u     :无符号的十进制数.
o     :无符号的八
x,X:十六进制数.
l,h: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设置返回到断点的执行点,并更改参数.这样可在一个调试会话中测试多个假设,节省测试时间,但它不能用于所有场合,因为函数执行会破坏 其状态.
另一个常用地点是测试时填充数据结构,如表和数组,可用它输入额外的数据并查看代码如何处理--当某些数据条件难于复制时更为方便.

(收藏文章)

### Keil5 Watch窗口数组显示Truncated解决方案 在Keil µVision5开发环境中,Watch窗口用于实时查看变量的值。然而,在某些情况下,当观察较大的数组时,可能会遇到“truncated”的提示[^1]。这通常是因为默认设置下,Keil仅允许显示一定数量的数据项。 #### 原因分析 Keil µVision 的调试器会限制每次加载到内存中的数据量以优化性能。如果数组大小超出此限制,则会在Watch窗口中显示为“truncated”。这种行为可以通过调整配置来改变。 --- #### 配置方法 ##### 方法一:修改Debug Configuration中的Data Size Limit 通过增加单次读取的最大数据量可以解决该问题: 1. 打开项目并进入 **Options for Target** 设置界面。 2. 转至 **Debug** 选项卡。 3. 在右侧找到 **Limit data size to (KB)** 参数,默认值可能较小(如64 KB)。将其增大到适合项目的数值,例如 `1024` 或更高[^2]。 4. 应用更改后重新启动调试会话。 这种方法适用于大多数情况下的大型数组显示需求。 --- ##### 方法二:利用表达式扩展显示范围 另一种方式是在Watch窗口中手动指定要显示的数组部分。例如,对于名为 `array` 的数组,可以在Watch窗口输入如下形式的表达式: ```c array[0..N-1] ``` 其中 `N` 是希望展示的元素总数。这种方式无需改动全局配置即可灵活控制输出长度[^3]。 注意:若尝试访问越界索引可能导致错误或异常中断程序运行流程,请谨慎操作。 --- ##### 方法三:切换至Memory Window查看完整内容 如果仍然无法满足需求,还可以考虑采用 Memory 窗口代替 Watch 来监视整个连续存储区域的内容。具体做法如下: - 定位目标地址; - 输入起始位置以及字节数/双字数等参数完成布局设定。 尽管不如前者直观易懂,但对于超大规模结构体或者动态分配缓冲区而言不失为一种有效手段[^4]。 --- ### 示例代码片段 假设存在一个含有千个浮点型成员的大规模向量对象定义如下所示: ```cpp float largeArray[1000]; for(int i=0;i<1000;i++) { largeArray[i]=i*0.1f; } ``` 按照前述指导原则之一调整好环境之后便能够正常浏览全部条目而不会遭遇裁剪现象发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值