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

进入到目标目录,并执行对应的cmm脚本。

do 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. adb命令——简单常用命令介绍:将文件从手机上传输到电脑里:adb pull /sdcard/123.png c:\users\del\desktop...

    adb pull <手机路径>   <本机路径>  从手机中拉取信息到本地电脑上 示例:adb    pull      /sdcard/123.png       c:\us ...

  2. nmap简单实用命令

    nmap语法 -A 全面扫描/综合扫描 例如: nmap -A -T4 127.0.0.1 探索网络 -T -T 时序选项 nmap -T1 127.0.0.1 同上 Nmap使用-T(0-5)可以启 ...

  3. Android客户端连接服务器- OKHttp的简单实用方法

    文章目录 一 .OKHttp简介 二. OkHttp3使用 1.创建HTTPClient实例 2.Get请求 3.POST请求 三.Timeouts(超时) **写在前面:本文只是对OKHttp3的简 ...

  4. lsof 命令实用用法介绍

    Table of Contents 前言 Linux 下有哪些文件 lsof 命令实用用法介绍 查看当前打开的所有文件 列出被删除但占用空间的文件 恢复打开但被删除的文件 查看当前文件被哪些进程打开 ...

  5. 计算机自爆命令,《我的世界》僵尸自爆指令一览 简单实用!

    原标题:<我的世界>僵尸自爆指令一览 简单实用! 在<我的世界>游戏中,僵尸是非常烦人的怪物,其实要对付它们也很简单,就是让僵尸自爆,那么各位玩家知道自爆指令是什么吗?如果你还 ...

  6. 虹科分享 | 简单实用的CANopen介绍,看完你就明白了(2)——CANopen框架与七种服务类型

    目前,CANopen通讯协议已经在工业领域得到了广泛的使用,由于其面向对象的设计思路,CANopen协议已成为欧洲等国家的自动化公司标配的通讯接口之一.在本系列文章中,我们将介绍CANopen协议的基 ...

  7. 在此处打开命令窗口_这样操作方便多了!简单DOS命令实用技巧详解

    分享简单DOS命令实用技巧,让我们的工作.生活更加方便快捷.小编致力于分享分享智能数码.弱电组网.电脑软硬件资讯及实用技巧. 先跟着小编一起来了解一下DOS命令是一个什么样子的存在?技术大牛,请忽略, ...

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

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

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

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

  10. linux学习-简单命令介绍及安装VMware Tools

    常用简单命令介绍 ethernet以太网 pts:模拟终端 图形界面: Ctrl+Alt+F1 字符界面:Ctrl+Alt+F2-F6 切换虚拟终端:(本机操作) # chvt 1-6 关闭图形界面, ...

最新文章

  1. modules not found(模块未找到)的解决方案
  2. react draft api 简介
  3. Pandas简明教程:七、Pandas缺失数据的处理(数据清洗基础)
  4. ZYNQ7000程序编译成功但烧写报错(使用Vitis2020.2)
  5. MySql中如果某一列中含有NULL,那么包含该列的索引就无效了?
  6. HarmonyOS之常用布局StackLayout的使用
  7. centos 对已有卷扩容_centos7下对原有磁盘分区进行在线扩容
  8. 看完这篇文章保你面试稳操胜券——React篇
  9. python 条件概率_使用Pymc3的条件概率
  10. 第一次在Django上编写静态网页
  11. mysql分页总页数算法解析_详解MySQL的limit用法和分页查询语句的性能分析
  12. 运行adb devices命令后 显示 List of devices attached 无法获取设备解决方法
  13. 一个字符带下滑线的EditText
  14. ServletResponse的常用方法:getWriter,setContentType
  15. 2022城通网盘仿蓝奏云修复版源码
  16. 爱了爱了!ALIENWAER外星人AW410K机械键盘Cherry茶轴RGB灯光全键无冲!免费包邮送到家!...
  17. 华为服务器修改管理网口,怎么设置华为服务器管理口
  18. Android 手机灭屏流程分析详解
  19. java-php-python-ssm幼儿园综合管理系统计算机毕业设计
  20. 戴尔p2314ht显示器拆解,清洁

热门文章

  1. 计算机硬件的五大逻辑部分,计算机的硬件系统由五大部分组成(计算机由几部分组成)...
  2. Ubuntu16.04 + 微软kinect 2 实现rgbdslam V2
  3. A Survey on Knowledge Graph-Based Recommender
  4. 美计算机科学学者建议:加强青少年网络安全意识引导
  5. 云服务器win10系统初始密码,win10进入安全模式需要密码初始密码是什么
  6. 基督教 犹太  新教  东正教 天主教
  7. js 浏览器永久保存数据:localStorage
  8. 02计算机优秀毕业论文-摘要·前言
  9. CC8编译报错:error #10099-D 解决方案(已解决)
  10. 小米平板2的win11生存指北