Trace32 Simulator debug

熟悉高通平台的童鞋可能会比较熟悉,高通有ramdump功能,当系统crash后通过warm reset重启来抓取ram中的数据,然后利用Trace32进行故障现场的查看来排查问题。这实际上用到的就是trace32的simulator功能,也就是仿真器功能,我们只需要获取到设备的内存快照来进行指令集的仿真,以此查看故障现场,而不用真实的连接目标板来实时调试。

Trace32在安装时可以选择多种方式:Software only/ICD/ICE等。其中software only的安装方式就代表Trace32纯软件安装,不使用JTAG或其他调试转接设备。当然不同的安装方式价钱是不同的,需要向LAUTERBACH公司购买不同的licence才能用。

在software only安装方式下,就包含了我们的仿真器功能。仿真器,顾名思义,就是一种对硬件的仿真模拟,类似于虚拟机,我们可以不用连接实体目标板,就可以对我们的软件进行一些debug。另外,在software only安装模式下,还可以支持gdb frontend功能,此时trace32软件可以作为gdb服务的一个前端,我们直接利用网线就可以连接到目标板上的gdbserver上来对目标板进行调试,此时是不用附加任何调试转接设备的,只需要一根传输介质即可(比如一个网线或者一个RS232串口线)。

Linux下安装Trace32请参考我的另一篇文章《ubuntu下trace32工具安装》https://blog.csdn.net/rikeyone/article/details/83791566

Trace32工具配置

一般Trace32安装后自带有默认的config.t32,比如我的安装目录下的:

/opt/t32/bin/pc_linux64/config.t32

如果我们使用simulator功能,那么有一个关键点配置如下:

PBI=SIM

如果我们使用gdbserver来调试,那么配置成如下:

PBI=GDB

高通的ramdump功能就必须要使用SIM,因为我们是离线调试,不用连接任何硬件设备,只用到仿真器功能。至于GDB Frontend功能可以去参考文档《TRACE32 as GDB Front-End》。

Trace32命令简介

title "My Trace32 Test"

设置trace32界面title名称。

sys.cpu CORTEXA53

指定系统的CPU类型,对于Simulator来说这个CPU类型没有特别的影响,指令集都一样。

sys.up

启动CPU,如果我们连接有目标板,那么此命令会重启目标CPU,初始化连接,并运行Reset Vector。

PRINT Register(D0)

打印D0寄存器中的值。

Register.Set NS 1

设置寄存器的值。这条的含义是设置Non-secure bit为1。

Register.Set CPSR 0x3C5

设置CPSR寄存器为0x3C5。

Register.view

查看常用寄存器的值。

data.load.binary DDRCS0_0.BIN 0x80000000

加载binary文件命令,把指定文件加载到指定地址,比如我们抓取到的故障现场的快照ramdump。除了起始地址外,还可以加上一个range参数,作为加载范围。加载时会以binary的大小和range之间选小值作为限制。

data.load.elf ../../vmlinux 0x1488800000 /nocode

加载elf文件命令,把指定的elf文件加载到目标设备或者仿真设备的0x1488800000地址上去。elf文件在编译时会把源文件的路径加入到elf文件中,我们后面加上/nocode代表没有对应的sourcecode,trace32就不会去对应目录去查找源文件了。当然我们也可以通过/path来指定sourcecode目录。比如:

data.load.elf ../../vmlinux 0x1488800000 /path  /home/xie/linux-4.4/

加载elf文件到指定地址,并且指定了和该elf对应的source code目录。

break.set 0x0c008000

设置断点。

cd dump_dir/

切换目录命令,类似与linux下的cd命令。

cd.do dump_dir/test.cmm

执行test.cmm脚本。

Data.Quad(<address>)
Data.Quad.BigEndian(<address>)
Data.Quad.LittleEndian(<address>)
Data.LongLong(<address>)
Data.LongLong.BigEndian(<address>)
Data.LongLong.LittleEndian(<address>)

返回address地址上的64bit数据,需要注意每个address需要指明它的Access Classes,比如 (D:0x200)

PRINT D.S(D:0x200)
PRINT Data.Short(D:0x200)

打印0x200地址的一个short类型数据

Data.Set SPR:0x30201 %Quad 0x8294b000

这里的SPR代表这Special Purpose Register,每个register大小为4Byte,后面跟着的是register number,所以这个命令修改的真实地址为0x30201 * 4。后面的代表写入数据的类型,最后一个参数为写入的数据值。

MMU.SCAN PT 0xFFFFFF8000000000--0xFFFFFFFFFFFFFFFF

加载特定虚拟地址的page table。PT代表从当前CPU的MMU中读取,由于前面我们用load对应的ramdump,并且配置MMU寄存器,所以此时可以通过PT这个参数读取出来对应的page table,并且配置到我们trace32的仿真器中来使用。

mmu.on

打开MMU功能。

mmu.pt.list 0xffffff8000000000

列出对应起始地址之后的page table。

task.config /opt/t32/demo/arm64/kernel/linux/linux-3.x/linux3.t32

通过指定的配置文件来配置trace32的RTOS仿真调试器,用来配置和加载系统内核用的。Trace32提前定义了一些可用的系统配置文件

menu.reprogram /opt/t32/demo/arm64/kernel/linux/linux-3.x/linux.men

启动预定义的linux系统对应的trace32界面。

task.dtask

显示系统中所有的task信息。

sYmbol.NEW.MACRO offsetof(type,member) ((int)(&((type*)0)->member))
sYmbol.NEW.MACRO container_of(ptr,type,member) ((type *)((char *)(ptr)-offsetof(type,member)))

创建宏定义,和C语言语法类似。

winpos 0% 0% 50% 100%

配置窗口参数,当使用下一个命令打开窗口时生效。分别代表x轴坐标,y轴坐标,宽度,高度参数。

w.v.f /a /l

Var.Frame的缩写,显示当前栈回溯,/a代表arg选项,显示参数,/l代表local选项,显示本地变量。

w.r

显示register窗口,和Register.view命令等效。

d.l
Data.List

显示当前运行的情况,PC指向所在的位置会高亮。

sYmbol.SourcePATH.List
sYmbol.SourcePATH.SetRecurseDir "/home/xiehaocheng/work/kernel-4.14"
sYmbol.SourcePATH.Translate "/remote/kernel-4.4" "/home/xiehaocheng/work/kernel-4.14"

用于显示/设置/修改 sourcecode的位置。一般我们使用SetRecurseDir设置内核代码路径,把其中包含的路径都加入搜索列表。elf格式的文件会把编译的源文件路径包含进去,所以默认是会有个sourcepath的,如果我们服务器编译的固件在debug时必须要重新修改下代码路径为本地才能正常查找到。

break.set

设置断点。

v.v

最后的重头戏,v.v是我们很常用的一个命令了,Var.View的缩写格式,目的是查看一个变量。比如:

v.v  %ASCII %STRING linux_banner

寄存器设置命令:

r.s x1 0x70ffe07a
r.s x2 0x6
r.s x3 0x6
r.s x4 0xf
r.s pc 0xffffff84f0691af8
r.s sp_el3 0x0
r.s elr_el3 0xffffff84f0691af8
r.s spsr_el3 0x204001c5
r.s sp_el2 0x858c5ff0
r.s elr_el2 0x810b1190
r.s spsr_el2 0x85
r.s sp_el1 0xffffff800800bf10
r.s elr_el1 0xffffff84f117c0e4
r.s spsr_el1 0x20c00145
r.s sp_el0 0xffffffffb437d580

r.s是register.set的缩写,也就是设置寄存器,有一个特殊的命令,打开中断功能:

r.s I 0

memory class

前面在介绍Data.Long命令时提到,如果要获取对应address地址上的数据时,除了地址还要指明此地址是的access type,那么如下是常用类型的定义:

P -Program Memory
D -Data Memory
S -Supervisor Memory (privileged access)
U -User Memory (non-privileged access)
SP -Supervisor Program Memory (privileged access)
R -AArch32 ARM Code (A32, 32-bit instr. length)
T -AArch32 Thumb Code (T32, 16-bit instr. length)
X -AArch64 ARM64 Code (A64, 32bit instr. length)
J -Java Code (8-bit)
Z -Secure Mode (TrustZonedevices)
N -Non-Secure Mode (TrustZonedevices)
A -Absolute addressing (physical address)

常见命令索引

d.load<filename> [/NOCODE] ][strippart] --Load dump/elf
y.spath.setbasedir--Set HLL search path
break <address> --Set breakpoint
register /spotlight --Display register
Log.open <file> log.close--Log command flow
d.v %SYMBOL.QUAD.LE <0xFFFFFFC0D9CCFD20> --Map elf and data
V.f--Display call stack
(Struct thread_info*) --Address
V.v var[0..?] --Variable and array
D.l or d.l<pc or lr>
r.s <PC>/r.s <LR>/r.s <SP> [of particular core]
Term.view--DCC console
D.image--Display frame buffer

Linux task相关命令:

task.dmesg    shows demsg
task.dtask
task.fs.mountdevs
task.module

v.v使用实例

v.v %s %t %o (struct clk_core *)0xffffffffad96d880

这个命令会以如下方式展示ffffffffad96d880地址上的结构体struct clk_core。这个使用方法还是比较常用的。

其中把%s会把其中包含的子成员为string的成员解释为string类型来显示。


v.f

用来查看系统当前的调用栈关系,通过这个界面,类似于kernel dmesg中的dump stack,我们可以查看函数调用栈回溯。通过这个可以分析函数运行到哪里,或者程序卡死在哪里,系统挂在哪里。


d.l

用来查看当前的PC指针运行情况。可以查看到当前PC指针对应的代码和汇编。

不同CPU运行信息查看

对于多核芯片,比如高通的ramdump,最后抓出来的数据,我们利用simulator功能来仿真时,每次只设置了一个CPU核,那么对于多核心怎么来确定,当前使用的是哪个CPU呢?实际上dump解析出来的数据,包含了


core0_regs.cmm core1_regs.cmm core2_regs.cmm core3_regs.cmm core4_regs.cmm core5_regs.cmm core6_regs.cmm core7_regs.cmm

这些文件分别存储了不同CPU核心的寄存器信息,我们通过在trace32加载不同的脚本来区分查看不同的CPU状态,实际上这些脚本中,只是设置了CPU的各个寄存器的值,从而切换到了不同CPU的运行现场。

Trace32 simulator调试以及简单实用命令介绍的更多相关文章

  1. Docker实用命令介绍

    Docker实用命令介绍 1. docker启动.关闭.停止 ╭─wil-xz in ~ 12:15:44 ╰─٩(ŏ﹏ŏ.)۶ service docker restart Redirecting ...

  2. Linux下好用的简单实用命令

    1.你是否为在输入了一大串命令之后发现第一个字符打错了而苦恼?只能删除重来嘛?或者一步步左移光标? NO,一个组合键轻松搞定 Ctrl+A -----到命令行首 Ctrl+E ------到命令行末 ...

  3. adb logcat调试中常用的命令介绍

    Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命 令来查看和使用. adb logcat 命令格式 : ad ...

  4. 关于git的简单实用命令

    时代在进步啊,现在已经不是svn的时代了,好多人都在使用git.所以自己也稍微学习了下git的使用. 常见的通过git提交代码步骤: git status :查看文件状态 :该命令显示你工程内修改的所 ...

  5. 「LINUX资料」简单实用命令less和vi(三)

  6. npm 简单实用命令

    npm -v    查看版本号 npm get global             返回false表示默认本地安装 true全局安装 npm set global=true     设置默认为全局安 ...

  7. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  8. GDB调试实用命令

    个人感觉从windows平台转到linux平台一个不适应的地方就是调试器的使用.因为windows下调试器基本上都依赖快捷键和图像界面来完成操作,就算是windbg这种伪命令行的工具,命令也很简单比较 ...

  9. [转]九个Console命令,让js调试更简单

    转自:九个Console命令,让js调试更简单 一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html ...

  10. 简单实用的Windows命令(一)

    前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...

随机推荐

  1. 我用Awesome-Graphs看论文:解读PowerGraph

    PowerGraph论文:<PowerGraph: Distributed Graph-Parallel Computation on Natural Graphs> 上次通过文章< ...

  2. 【WSDL】03 使用注解自定义服务信息

    对原来的自定义WebService设置注解: package cn.cloud9.jax_ws.server.intf; import javax.jws.WebMethod; import java ...

  3. 【Windows】Win10 20H2版本 管理员身份问题

    问题描述: 从之前的1909版本升级过来的,在一开始就是管理员身份,升级之后还是管理员身份没错 但是打开一些软件又会开始提示是否安全,还有C盘访问权限警告. 解决办法: 参考方案地址 http://w ...

  4. 很好用的python游戏环境:强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个python语言的迷宫游戏环境

    项目的GitHub地址(作者:莫凡): https://github.com/MorvanZhou/mmaze 运行的示例代码: import mmaze start = (0, 0) end = ( ...

  5. 强化学习运行环境,atari 2600 游戏模拟器,atari-py库 —— 无法运行游戏,pacman,surround,报错: Segmentation fault (core dumped)

    atari2600运行环境: https://github.com/openai/atari-py 安装环境,以及导入 rom文件这里不进行介绍(前文已介绍): 测试游戏环境rom文件能否正常加载如内 ...

  6. Apache DolphinScheduler 3.1.8 版本发布,修复 SeaTunnel 相关 Bug

    近日,Apache DolphinScheduler 发布了 3.1.8 版本.此版本主要基于 3.1.7 版本进行了 bug 修复,共计修复 16 个 bug, 1 个 doc, 2 个 chore ...

  7. 基于SiliconCloud快速体验GraphRag.Net

    SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型,提供高性价比的 GenAI 服务. 不同于多数大模型云服务平台只提供自家大模型 API,SiliconCloud上架了包 ...

  8. 朋友吐槽我为什么这么傻不在源生成器中用string.GetHashCode, 而要用一个不够优化的hash方法

    明明有更好的hash方法 有位朋友对我吐槽前几天我列举的在源生成器的生成db映射实体的优化点 提前生成部分 hashcode 进行比较 所示代码 public static void Generate ...

  9. 免费word简历 简历制作平台

    分享一个简历制作平台. 免费的word模版 链接地址 https://www.xyjianli.com/ https://www.xyjianli.com/list https://www.xyjia ...

  10. .NET8 Blazor 从入门到精通:(三)类库和表单

    目录 Razor 类库 创建 使用 使可路由组件可从 RCL 获取 静态资源 表单 EditForm 标准输入组件 验证 HTML 表单 Razor 类库 这里只对 RCL 创建和使用的做一些简单的概 ...