嵌入式程序停在错误处理函数里时,真正出问题的操作可能早已执行完毕。重新运行未必能复现同样的中断时序,沿调用栈查看也只能看到当前停机位置。MULTI的TimeMachine可以利用已记录的执行轨迹,向前或向后查看程序经过的路径,帮助定位异常出现之前的分支和调用。能回溯多远、能查看哪些历史变量,则取决于采集方式和轨迹完整程度。
一、Green Hills MULTI怎么进行反向调试
反向调试要先采集程序执行数据,再进入TimeMachine查看历史位置。以下采用硬件轨迹或受支持模拟器的操作流程,菜单名称按英文界面说明,具体采集选项需与安装版本及目标处理器对应。
1、连接目标并配置轨迹采集
先用一段容易复现的程序确认采集链路,跑通后再处理持续时间较长的故障。
①、在【MULTI Debugger】中连接目标,加载与目标程序一致的【ELF】文件,确认普通断点和源码定位可以使用。
②、打开【TimeMachine】→【Trace Options】,检查轨迹来源、采集范围和缓冲设置。硬件连接核对目标核及跟踪通道,模拟器连接核对该目标是否支持轨迹生成。
③、按目标连接配置启用【Trace】采集,设置错误处理函数或故障检测位置的断点,运行到问题发生后暂停。
2、取回数据并进入历史调试
①、点击【TimeMachine】→【Retrieve Trace】,或在命令窗格输入【trace retrieve】,取回本次记录。
②、在目标列表中选中需要分析的目标,点击【TimeMachine】→【TimeMachine Debugger】,进入历史调试状态。
③、核对目标状态和当前执行位置,再执行一次向后单步,确认程序指针能够移动到较早的记录位置。
部分版本会在首次向后运行或单步时自动取回轨迹。遇到等待时间较长的情况,可以先确认传输和解码进度,避免重复启动会话而丢失故障现场。
3、沿执行路径向前追查原因
①、在【Debugger】命令窗格输入【bs】,向后单步查看上一段执行;需要按当前显示粒度后退时,使用【bprev】,并核对源码或汇编显示模式。
②、在已记录路径上的可疑位置设置断点,输入【bc】向后运行,检查此前经过的调用和分支。
③、打开【PathAnalyzer】查看调用随时间的变化,定位可疑函数后进入对应历史位置。需要回到实时调试时,选择【TimeMachine】→【Leave TimeMachine Mode】。
二、Green Hills MULTI回溯执行需要哪些条件
回溯能力由软件授权、目标支持和实际记录共同决定。普通连接能够停机、查看寄存器,还需要继续确认轨迹链路是否具备所需能力。
1、具备对应授权和受支持的采集来源
①、核对许可证配置,确认当前环境包含所需【TimeMachine】功能,并检查是否存在授权获取失败的信息。
②、使用硬件目标时,对照【处理器型号】、【跟踪接口】、探针及适配器的支持范围,检查开发板是否引出了所需接口。
③、使用模拟器时,确认所选【指令集模拟器】支持该目标的轨迹采集,并先运行短程序验证记录结果。
④、若采用【INTEGRITY TimeMachine】运行模式方案,按该方案要求配置应用插桩、目标支持和授权,单独核对其适用范围。
硬件轨迹方案和INTEGRITY插桩方案有各自的配置要求。插桩会带来运行开销,硬件方案则依赖芯片跟踪能力与板级连接,选用时要结合故障对时序的敏感程度。
2、记录覆盖故障发生前的执行区间
故障表现与错误起点之间可能隔着很长时间,缓冲区只保留末尾一小段时,程序虽然能后退,却到不了起因位置。
①、在【Trace Options】中检查缓冲容量、采集条件和停止条件,确认记录包含故障触发之前的目标区间。
②、查看【Trace List】或相关分析窗口,检查记录起止位置及是否存在数据间断,再核对异常前的关键函数是否出现。
③、若历史范围不足,调整采集窗口或触发条件,重新复现。多核问题同时核对相关核的采集范围与时间关联能力。
3、程序映像与状态信息足够完整
①、保存故障对应的【ELF】、源码版本和加载地址,检查动态模块或其他执行映像是否已正确提供给调试器。
②、在历史位置打开【Register View】和【Memory View】,检查所需寄存器及内存值是否能够重建。
③、遇到【Unreadable/Unknown】时,核对轨迹是否包含相关数据访问,以及记录是否足够早;再按目标支持情况调整采集配置。
指令路径可回溯,并不保证每个历史变量都可读取。数据访问记录缺失、编译优化或记录范围有限,都可能限制状态恢复。判断问题时,应区分已重建的值与无法确定的值。
三、Green Hills MULTI反向调试异常时怎么排查
回溯停住、源码跳行或变量不可读,可能来自不同环节。先分清记录边界、源码映射和数据恢复问题,排查会更有方向。
1、后退按钮不可用或很快到达边界
①、检查【TimeMachine】授权、当前目标选择及采集状态,确认本次运行确实生成了轨迹。
②、执行【Retrieve Trace】,在【Trace List】中核对记录长度,再检查当前历史位置是否已经接近记录起点。
③、若记录中没有目标函数,检查采集过滤和目标核设置,调整后重新运行并取回数据。
已经覆盖掉或未曾采集的执行区间,需要通过下一次记录补充。重新采集前保留本次定位信息,可以缩短下一轮的触发范围。
2、源码位置或变量显示不符合预期
①、将【ELF】构建版本与目标固件对应,检查源码文件及加载地址是否一致。
②、切换到【汇编显示模式】,沿记录中的指令地址核对执行顺序,再与源码行号对应。
③、将优化后不可直接读取的局部变量,与【寄存器】、【内存】及相关数据访问记录交叉检查。记录证据后,返回实时模式复现验证。
总结
TimeMachine的价值在于保留故障前的执行线索,让调试可以从错误表现追到此前的调用和分支。配置时应把授权、目标跟踪支持、记录窗口和程序映像放在一起确认,使用时则要认清历史数据能够恢复到什么程度。希望大家遇到偶发故障时,能先保住一段完整现场,再逐步缩小可疑路径,减少反复复现带来的时间消耗。
