Skip to content

软件异常分析工具Trace32使用指南

本文档介绍了当程序死机时使用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(运行)状态,优先级为 4IDLE 任务处于 ready(就绪)状态,优先级为 1;其他任务(如 lfsalmTask 等)多处于 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进行函数查找

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