软件异常分析工具Trace32使用指南¶
本文档介绍了当程序死机时使用Trace32分析的方法。
Trace32安装¶
导入死机现场¶
Yopen:软件设置yopen_debug_set_fault_action(YOPEN_EXCEP_OPTION_DUMP_FLASH_EPAT_LOOP).运行异常时EPAT自动打开RamDump对话框
AT:设置AT*EXASSERT=1,出现异常EPAT会自动打开RamDump对话框

- 
RAM DUMP FILE:默认情况下设备发生错误时生成的 Dump 文件在工具当前目录
bin/Ramdump下 - 
axf/elf file:位于设备当前下载的固件文件中
 - 
TRACE32:选择trace32程序路径
 - 
配置完成后点击ok,跳转到死机问题现场
 - 
如果trace32加载出现错误,选择手动导入,通过
File->Run Script...打开位于EPAT文件夹的bin/hw_dev.cmm 

导入文件之后会显示如下界面:

常见死机问题分析¶
常见死机原因以及具体分析步骤参考Yopen进阶篇死机问题分析
trace32基础使用¶
检查任务列表¶

左侧窗口展示了系统中各个任务的详细信息,包括 magic(魔术值)、name(任务名称)、num(任务编号)、prio(任务优先级) 和 state(任务状态)。
例如,HELLO 任务处于 running(运行)状态,优先级为 4;IDLE 任务处于 ready(就绪)状态,优先级为 1;其他任务(如 lfs、almTask 等)多处于 suspended(挂起)状态,且各自拥有不同的优先级数值。
检查是否有任务处于异常状态:例如,如果某个任务长时间处于 “运行” 状态但没有任何进展,或者大量任务处于 “挂起” 状态且无法恢复,这可能是软件异常的一个迹象。
监视关键变量¶

此窗口用于监视程序中的变量,可以添加可能与异常相关的关键变量到监视列表中,点击变量窗口的view选项展开变量详细信息。
这些变量可能包括计数器、标志位、指针等。通过监视这些变量的值,可以通过添加变量了解程序的运行状态。例如,如果一个计数器的值超出了预期范围,或者一个指针指向了非法的内存地址,这可能意味着程序出现了问题。
分析寄存器和内存¶
查看寄存器状态
点击 CPU → Register 查看寄存器状态

程序计数器指向当前正在执行的指令地址,如果它的值异常,可能意味着程序的执行流程出现了问题。栈指针指向当前栈的顶部,如果它的值超出了栈的范围,可能会导致栈溢出。链接寄存器保存了函数调用返回的地址,如果它的值不正确,可能会导致函数无法正常返回。
检查内存内容
点击 View → Dump查看内存状态

- 
Address / Expression:用于输入要查看的内存地址或表达式,指定数据转储的位置。
 - 
Width:设置数据显示宽度:
 - default:默认宽度(依系统或上下文自动确定)。
 - Byte:以字节为单位显示。
 - Word:以字为单位显示。
 - 
Long:以长字为单位显示。
 - 
Access:设置访问方式:
 - default:默认访问方式。
 - 
E:特定访问模式。
 - 
Options:设置显示选项:
 - Track:勾选后持续跟踪数据变化。
 - Orient:调整显示格式或方向。
 - Ascii:以 ASCII 码显示数据,便于查看字符内容。
 - SpotLight:突出显示特定数据。
 
输入关键内存地址(如程序关键数据区、堆栈地址),查看内存内容是否被篡改、有无越界访问(如栈溢出导致栈外内存被改写)。若某块内存数据异常,结合代码逻辑分析是否为死机诱因。
查看调用栈信息¶
点击 View → Stackframe with Locals /Stackframe查看调用栈信息

- Stackframe with Locals:除了展示函数栈帧的基本结构(如返回地址、栈帧指针等),还会显示当前栈帧内的 局部变量 及其值。
 - Stackframe:主要展示栈帧的基本信息(如调用层级、栈帧地址范围等),不包含局部变量的具体内容。
 
调用栈中会显示程序执行过程中各个函数的调用关系,通过分析调用栈,可以确定程序死机时所处的位置和相关的函数调用路径。
函数查找¶
点击 View → Symbols进行函数查找

输入函数名称,双击可以直接跳转到其起始汇编地址,查看函数详情
