您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

TRACE32调试技巧

2024/6/21 19:56:12发布26次查看
1.调试步骤 l连接好trace32-icd和目标板,注意不要带电插拔jtag,容易损坏trace32或目标板,然后依次打开trace32-icd和目标板的电源。 l开启调试软件trace32 l设置cpu类型,状态等,可以通过命令或菜单,命令如下: sys.reset sys.cpu arm7tdmi ;这里设置cpu
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和问题机器关联上,这样就可以进行源码级调试了。
下面说说怎么用trace32调试kernel.
    首先讲讲硬件连接,必须保证你的trace32是连接到arm11的jtag口上,其他连接不细说了。
    打开trace32的命令窗口,并对cpu设置,如下图所示:
进入设置界面,设置如下:
然后依次输入命令“cd z:/out/target/product/msm7627_surf/obj/kernel_obj”, d.load.elf vmlinux /nocode,如下图所示:
之后打开符号表,查找你要debug的函数,如下图所示:
设置好断点之后,还需要进行如下设置,如图:
接着,点击go,即可进入断点,如下图:
可以看到,已经进入断点,但是一堆的汇编,怎么显示对应的c code呢?用“symbol.sourcepath.setrecursedir z:/kernel”添加路径, 如图:
最后,我们看到了正确的code,如下:
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product