软件异常分析工具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进行函数查找
输入函数名称,双击可以直接跳转到其起始汇编地址,查看函数详情