程序跑起来以后,变量窗口里的数值一直没有变化,很容易让人以为是代码逻辑根本没有被执行。关于TRACE32变量监视怎么添加,TRACE32变量值刷新异常怎么处理,得先区分出两种情形:一种是在程序暂停下来时去查看变量,另一种是让程序在运行过程中持续刷新。TRACE32提供了Var.View、Var.Watch这些功能,也具备运行时访问内存的能力;但是芯片的架构、缓存、MMU还有调试时的配置,全都会影响最终显示的结果。Lauterbach的文档也说明,程序运行期间能不能直接读写内存,要看目标处理器是否支持对应的访问方式。
一、TRACE32变量监视怎么添加
添加变量监视可以临时进行,也可以直接写进启动脚本里。调试单个变量时用Var.View比较方便,需要同时观察多个状态量的话,Var.Watch会看得更清楚。
1、先加载匹配的符号文件
连接目标板以后,要确认当前的ELF、AXF或调试符号文件与板上运行的程序来自同一次构建。如果符号版本对不上,变量名可能还能搜到,但地址已经发生变化,窗口里看到的数值就没有参考意义了。
2、用Var.View查看单个变量
在命令行输入【Var.View variable_name】,比如【Var.View g_counter】;也可以通过菜单【Var】→【View】,从符号浏览器里选取变量。按照Lauterbach教程的说明,Var.View窗口能显示选中的变量,并支持在窗口中右键设置显示格式。
3、用Var.Watch集中观察多个变量
需要同时监视状态字、计数器和数组成员时,可以输入【Var.Watch g_state g_counter flags[0]】这样的命令。数组、结构体和全局变量都可以按实际名称添加进去;那些常用的变量,建议写入.cmm脚本,免得每次重新输入。
4、打开变化高亮
变量很多时,可以使用【Var.Watch%SpotLight g_state g_counter】;SpotLight会用深浅不同的颜色标出近期发生了变化的那些数据。也可以在变量窗口里右键选择【Format】,再打开SpotLight功能。
二、TRACE32变量值刷新异常怎么处理
变量值只有在程序停下来时才变化,并不一定是监视窗口坏了。默认情况下,一部分芯片在运行状态下不能直接读取目标变量,或者读取到的是物理内存里的旧值。
1、先暂停程序做对照
点击【Break】让程序停下,再观察变量是否更新。如果暂停后数值正常,说明符号和地址大致没有问题,排查重点就应该转到运行时刷新方面的配置上。
2、启用运行时内存访问
目标芯片支持非侵入式访问时,可以设置【SYStem.MemAccess Enable】。ARM或Cortex平台上常见的设置是【SYStem.MemAccess DAP】;随后用【Var.View%E g_counter】查看变量,这里的%E表示通过运行时内存访问来读取该变量。Lauterbach文档给出的示例同样是【Var.View%E flags】。
3、检查缓存和MMU造成的影响
程序运行时,调试器可能只能读取物理内存,无法直接读取缓存;如果目标变量所在的区域使用了回写缓存,窗口里就可能显示旧值。MMU映射动态变化时,运行时访问也可能无法正常工作。
4、谨慎使用侵入式刷新
芯片不支持直接访问的情况下,可以评估一下【SYStem.CpuAccess Enable】。这种方式会周期性地短暂停止程序,然后读取指定的内存区域。官方教程提醒,每次更新至少需要50微秒,实际时间还会受核心数量、缓存和MMU访问的影响;对于那些实时性要求较高的任务,不要长期打开这种功能。
三、TRACE32变量监视怎样减少误判
刷新相关的配置处理完之后,还要看变量本身是否适合实时观察。局部变量、被优化掉的临时变量以及多核共享变量,都可能让窗口里的结果难以解释。
1、优先观察全局状态量
需要长期监视的变量,尽量使用地址稳定的全局变量。局部变量只在函数执行期间有效,一旦离开作用域,再去查看窗口时,数值可能已经失效了。
2、核对当前核心和运行环境
多核项目要确认变量属于哪个核心,程序当前停在哪个上下文里;对于共享内存,还要结合缓存一致性策略一起判断,不要只盯着窗口里某一次刷新结果就下结论。
3、保留一份监视脚本
把【Var.Watch】、【SYStem.MemAccess】和关键变量列表写进.cmm脚本。换板子、换程序版本或者换调试人员时,先运行同一套脚本,再去对照前后的结果,会方便很多。
总结
变量窗口表面上看着简单,背后仍然受符号、地址和目标芯片访问方式的影响。TRACE32变量监视怎么添加,TRACE32变量值刷新异常怎么处理,实际顺序是先加载匹配的符号,用【Var.View】或【Var.Watch】添加变量,再通过暂停程序来判断是否属于运行时刷新问题。需要动态查看时,再去评估【SYStem.MemAccess】和%E格式,同时也要留意缓存、MMU以及实时性所带来的影响。