Green Hills中文网站 > 使用教程 > Green Hills MULTI怎么进行反向调试 Green Hills MULTI回溯执行需要哪些条件
教程中心分类
Green Hills MULTI怎么进行反向调试 Green Hills MULTI回溯执行需要哪些条件
发布时间:2026/11/11 11:00:13

  嵌入式程序停在错误处理函数里时,真正出问题的操作可能早已执行完毕。重新运行未必能复现同样的中断时序,沿调用栈查看也只能看到当前停机位置。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的价值在于保留故障前的执行线索,让调试可以从错误表现追到此前的调用和分支。配置时应把授权、目标跟踪支持、记录窗口和程序映像放在一起确认,使用时则要认清历史数据能够恢复到什么程度。希望大家遇到偶发故障时,能先保住一段完整现场,再逐步缩小可疑路径,减少反复复现带来的时间消耗。

读者也访问过这里:
176 5129 0128