TRACE32的常用命令和调试技巧
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TRACE32的常用命令
TRACE32是由德国Lauterbach公司研制开发的一款仿真测试工具。
我们使用Trace32最主要用途有两个:程序下载和程序调试。
下载目前各个项目都有相应的.cmm文件(类似于批处理文件.bat),在此文件中,Trace32把对FLASH擦除/编程的插件下载到手机的SRAM中,然后把控制权交给此插件,详细过程就不在此叙述,这里主要是介绍一些我们在程序调试过程中常用的一些命令。
1.把调试用的.elf文件下载到目标板中
命令:d.load.elf *.elf 或者直接输入elf文件路径:d.load.elf d:\p200\surfcr.elf
说明:此命令把.elf文件中的调试符号信息下载到Trace32中,二进制代码下载到目标板中的代码段存储区域。
如果代码段对应的存储体是SRAM,那么代码
能够真实的下载到SRAM中(最常见的就是EVB板条死)。
如果存储体是FLASH
,由于FLASH程序的擦写需要特殊的命令序列,所以执行完下载命令后,虽然
Trace32没有报错,但实际上代码没有下载进去。
这个时候需要用cmm文件把代
码下载到FLASH中去。
2.elf文件下载进去后,在调试之前还需要做一些准备工作
a.map.bonchip 0x0—0x3ffff(FLASH的地址范围)
如果程序下载到SRAM中,此命令不用执行,如果是FLASH,一般情况下都需要执行此条命令,否则无法设置断点,目前大多数CPU在ICD调试模式下只支持两个硬件断点。
b.y.spath + 路径(eg: y.spath d:\z2100\qct)
支持所加路径的C源码以及汇编代码显示。
3.以上工作做完后,就可以利用Trace32强大的调试功能来调试程序了(可惜到现在我
们只是用到了其中的一部分)。
a.查看ARM寄存器。
一般使用在调试/查看汇编代码的情况下使用。
b.查看存储器单元以及存储器映射的寄存器内容。
注意:MSM5105的寄存器具有只
读和只写属性(SoftWare Interface中有描述),对于只写属性的寄存器,虽然能够看到寄存器的内容,但不可信。
有时调试需要直接对寄存器或者变量进行赋值,可以双击对象,在命令行中加以更改。
c.设置断点。
断点调试应该是我们最常用的调试手段了,具体设置方法可以在代码处
直接双击设置或取消设置,或者通过工具条设置:
点击Browse,选择要设置断点的函数。
d.读出存储器区域的内容,存成文件,以便于和原文件进行比较。
比如怀疑代码区内
容被更改或者在软件部制作完整的.bin本时,都需要用到此命令。
Data.save.Binary FileName Address
e.STEP(F2)/STEP OVER(F3)/GO(F7)
f.有时侯,Trace32不能正确显示临时变量的值,这个时候可以通过查看汇编代码的
方式确定临时变量真实的值。
g.查看函数的调用关系
有时需要弄清楚某一函数是哪个函数调用的,可以通过在此函数处设置断点,等程序停在此断点后,点击菜单view/Stackframe就能看到。
h.但有时候采用上述方法无法看到调用关系,这是可以通过R14寄存器(子程序链接
寄存器)来实现,eg:程序因为某种异常,跳到了中断向量表处。
此功能对于定位程序重启之类的问题还是很有效的。
第一步:设置断点
第二步:查看R14寄存器
能够看到R14寄存器的值是0x1BA9C8,此地址就是调用处代码的地址,具体内容可以点击Indirect List查看:
第三板:查看调用代码
i.其他
以上是在命令行中输入的一些常用命令,其他的很多功能我还没有用过,相信这些功能对于我们的调试还是很有帮助的。
大家调试时可以多试一试,如果有意外的发现,还请和大家一起分享,共同提高我们对调试工具的掌握程度!
TRACE32 调试技巧
1. 调试步骤
l 连接好TRACE32-ICD 和目标板,注意不要带电插拔JTAG ,容易损坏TRACE32 或目标板,然后依次打开TRACE32-ICD 和目标板的电源。
l 开启调试软件TRACE32
l 设置CPU 类型,状态等,可以通过命令或菜单,命令如下:
sys.reset
sys.CPU ARM7TDMI ; 这里设置CPU 类型
sys.up ; 启动调试,如果正常的话,状态为system.ready; 否则会报错,需要检查CPU 设置是否正确,TRACE32 和目标板的连接和电源是否正常
如果调试正常启动后,就可以下载编译好的文件(可以是 .elf 、 .binary 等文件)到RAM 或FLASH 中调试了
l 下载编译文件,命令如下:
data.load.elf E:\source\test.elf /PATH E:\source
这里的/PATH 选项是用来指明源代码的路径,在调试时TRACE 就可以查找到源代码了。
这里TRACE 会根据 .elf 文件里包含的目标代码起始地址加载到RAM 的对应地址上,也可以指定加载到RAM 的地址,但须和编译时的设置一致,否则程序不能正常运行。
注:TRACE 也可以把编译目标文件烧录到flash 中进行调试,需要使用flash 烧录相关命令,这里就不详述了。
l 然后就可以设置断点进行调试了,如:
break.set 0x0c008000
TRACE32 的断点有两种,一种是硬件断点(在FLASH 中的断点),另一种是软断点(在RAM 中的断点);硬件断点需要CPU 的支持,如ARM7 最多只支持2 个硬件断点,如果使用了软断点的话,就只能使用一个硬断点了;而软断点没有限制,可以设置很多个。
注:在TRACE32 中,如果要使用硬件断点,需要先设置好FLASH 内存映射范围,如下命令:
Map.bonchip 0x0000--0xfffff ; 具体范围根据目标板FLASH 的范围设置
l 设置好断点就可以正常调试了。
2. 源代码调试
在编译源码的时候,编译成( 加-g 选项)debug 版本的目标文件(可以是axf/elf 等格式),用TRACE32 就可以直接进行源代码调试了。
TRACE32 几乎支持所有的编译器的编译文件,具体格式参见TRACE32 的帮助。
axf/elf 等编译文件也叫符号文件,即在文件中把源码的符号表(函数/ 变量等)保存下来了,供调试时使用,但里面的符号表只是起定位作用,在调试时还需要有目标源代码,否则只能进行汇编级调试,TRACE32 支持把机器码反汇编成汇编语言进行调试,而且不需要目标文件支持,TRACE32 可以自动从FLASH/RAM 中读取机器码,然后反汇编成汇编代码。
通过data.load 命令把符号表文件(.elf 等) 下载到目标机器上,指定源代码路径,就可以进行代码调试。
data.load.elf E:\source\test.elf /PATH E:\source
3. 死机定位方法
在调试产品时会碰到设备死机的情况,如下在调试过程中出现问题,可以很方便的用TRACE 来查看问题;但如果是设备在正常运行时(没有接JTAG 调试)出现问题或死机就比较难定位问题了;这里可以通过TRACE32 的attach 功能来进行调试,如下:
l 把出问题的机器和TRACE32-ICD 连接好(连接JTAG ,测试机器需先预留JTAG 口),然后开启TRACE32 ,设置好CPU 类型,使用sys.attach 命令就可以让TRACE32 和问题机器连接上了,正常连接后,system 的状态就变成了running 或up 。
l 接下来可以就可以直接进行汇编级调试了。
l 但一般情况下,汇编级调试很难定位问题,需要进行源码级调试,可以按如下操作进行:先把TRACE32-ICD 和一个同问题机器同类型的机器连接好,然后把符号表文件( .elf 文件等)下载(通过data.load 命令)到好的机器上,然后再把JTAG 线从好的机器上拔下,连接到问题机器上;然后再用sys.attach 命令让TRACE32 和文件机器连上,这样就可以进行源码级调试了。
如果不想这么麻烦,也可以这样操作,连接好TRACE32-ICD 和问题机器,打开TRACE32 软件,此时system 的状态为“ system down ” , 然后通过“ data.load ”命令下载符号表文件(.elf 等) ,由于system 状态为down ,TRACE32 会提示没有符号表文件没有下载成功,不用管它,因为虽然没有下载到问题机器的RAM 上,但符号表文件已经下载到TRACE32 上了;然后再通过sys.attach 命令让TRACE32 和问题机器关联上,这样就可以进行源码级调试了。