Trace32的Trace能不能录到东西,取决于两件事是否同时成立:一是目标侧有没有真正生成Trace数据,二是调试器侧有没有把Trace数据抓进缓冲并正确解码。很多现场的表现是看起来已经连上也点了开始,但Trace窗口里一片空白,这通常是生成与采集其中一步没走通,按固定顺序核对会更快收敛。
一、Trace32 Trace怎么开启
开启Trace建议先选清楚你要录的是哪一类Trace,例如ARM CoreSight的ETM指令流,或Cortex M的ITM和SWO消息;不同类型的入口不同,但思路都一样,先把基础配置固定,再用一个最小触发录一段短数据验证。
1、先确认Trace硬件链路是否具备
在项目文档里确认目标是否有ETM和TPIU,是否走并行TRACEDATA或走串行Trace,或是否只支持ITM和SWO;如果芯片和基础设施已被Trace32识别,工具通常能自动配置CoreSight组件,反之要补齐配置再录。
2、把CoreSight基础配置先跑通
在命令行输入SYStem.CONFIG.state/COmponents查看CoreSight组件状态,确认组件能被识别后再继续;如果你用的是并行Trace口,需明确PortSize并与板级实际TRACEDATA引脚数量一致,否则会出现录到但解码为空或错乱。
3、启用ETM并准备Trace硬件路由
在命令行按顺序输入ETM.PortRoute AUTO或按板卡要求指定路由,再输入ETM.PortSize设置端口宽度,最后输入ETM.ON打开ETM;若你为了复用引脚设置过ETM.PortDisable或ETM.PortDisableOnchip,先检查是否把ETMEN压成0导致Trace口被关掉。
4、用TraceEnable或TraceON TraceOFF把生成范围收敛
想只录某段代码时,不要全程开大录到爆缓冲,优先用断点事件做Trace过滤,例如在函数入口设置Break.Set sieve/Program/TraceEnable让目标只在该事件发生时生成Trace,或用Break.Set func216/Program/TraceON与Break.Set sYmbol.EXIT(sieve)/Program/TraceOFF定义开始与结束。
5、开始录制并打开分析窗口验证
先执行一次清理再录短段,避免旧数据干扰,然后点击【Trace】→【List】或在命令行打开Trace.List查看是否出现TRACE ENABLE标记,再根据需要打开Trace.Chart.Func等窗口做函数级视图联动分析,右键窗口标题可反查对应命令便于脚本化复现。
二、Trace32 Trace录不到数据怎么排查
录不到数据要先判断是目标根本没生成,还是生成了但没被抓到,还是抓到了但解码没对上。建议每一步都做可重复验证,例如只录一个函数入口,只跑几十毫秒,减少变量。
1、先区分生成问题还是采集问题
如果你用了TraceEnable或TraceON TraceOFF,先在Trace.List里看是否出现TRACE ENABLE标记,没有标记优先当作生成侧没有触发或没有生效;有标记但内容为空,再转向采集与解码链路。
2、检查ETM是否真的处于开启状态
在命令行查看ETM.state相关信息,确认ETM.ON已生效;同时确认没有把ETM.PortDisable设为ON,因为它会强制ETMEN为0从而通常禁用Trace输出。
3、核对PortSize与板级引脚一致性
PortSize设置错误会导致Trace数据流结构不匹配,常见结果就是录制看似在跑但解码窗口不出有效记录;按板卡实际TRACEDATA引脚数量重设PortSize后再录一段短Trace复测。
4、怀疑触发没命中就用最小触发替换
把复杂触发先下掉,用一个必经点验证,例如只留Break.Set main/Program/TraceEnable或只留一个函数入口的TraceON,再运行到该点;如果最小触发能出数据,问题多半在你原来的触发条件或开始结束范围设置上。
5、如果你录的是ITM和SWO先检查解锁与使能
ITM在使用前需要启用并解锁,Trace32会通过设置TRCENA并写入0xC5ACCE55到ITM_LAR完成相关动作;如果你的工程在低功耗或安全态下把这些通道关掉,就可能出现连得上但ITM窗口无输出,需要先把目标运行态拉回可追踪状态再看数据。
6、确认芯片与基础设施是否被正确识别
如果SYStem.CONFIG.state/COmponents显示组件缺失或识别不完整,Trace32无法正确配置CoreSight链路时容易出现录不到或解码失败;这类情况优先补齐芯片描述或按培训文档思路逐项把基础设施配起来再录。
三、Trace32 Trace录不到数据先确认TraceEnable有没有生效吗
这一段只做一件事,用一套最短路径确认Trace过滤是否真正生效,避免你以为开了Trace其实一直没触发,结果把时间花在错误方向。
1、先用一个必经函数入口做TraceEnable
点击【Break】→【Set】把断点落在必经函数入口,再改为带/TraceEnable的事件,或直接命令行输入Break.Set sieve/Program/TraceEnable,确保生成条件一定会发生。
2、只运行到触发点附近就停
点击【Go】让程序运行到该入口附近即可,不要长时间全速跑,避免你看不到关键标记又让缓冲被大量无关数据挤满。
3、打开Trace.List确认是否出现TRACE ENABLE标记
点击【Trace】→【List】或命令行打开Trace.List,若仍没有TRACE ENABLE标记,优先回到事件地址是否正确与是否真的执行到该点;若标记出现但没有有效记录,再回到ETM与PortSize等采集链路排查。
4、把验证动作固化成脚本便于复现
把你这次能稳定复现的最小触发与窗口命令保存下来,后续每次变更配置只跑这套最小验证,就能快速判断是触发侧坏了还是采集侧坏了。
总结
Trace32开启Trace时,先把CoreSight基础设施识别与PortSize对齐,再用ETM.ON把生成端打开,并用/TraceEnable或/TraceON/TraceOFF把范围收敛,最后用Trace.List确认TRACE ENABLE标记与有效记录。录不到数据时先分清生成与采集哪个环节没走通,优先用最小触发验证TraceEnable是否生效,再回到ETM端口控制与组件识别逐项定位,通常能更快把空白Trace窗口变成可分析的数据流。