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和问题机器关联上,这样就可以进行源码级调试了。


下面说说怎么用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,如下:

  


<think>我们正在讨论Trace32的Var功能,这是一个强大的变量监控和调试工具。用户希望了解Var功能的使用方法,包括如何定义变量、监控变量变化以及绘制曲线等。下面我将详细介绍Trace32中Var功能的使用方法。</think>### Trace32 Var 功能使用教程 Var 是 Trace32 的核心调试功能,用于创建、监控和操作调试变量,支持实时数据可视化、条件触发和数据分析。以下是完整使用方法: --- #### 一、变量定义与赋值 **1. 基本变量创建** ```tcl ; 创建整数变量 Var.NEW &my_int %Long 0x1000 ; 创建浮点变量 Var.NEW &my_float %Float 3.14 ; 创建字符串变量 Var.NEW &my_str %String "Hello_Trace32" ``` **2. 绑定硬件寄存器/内存** ```tcl ; 绑定32位寄存器地址 Var.Set &reg_val %Long 0xFFE0D0AC ; 绑定内存数组 Var.Set &array %Long &(0x20000000..0x200000FF) ``` **3. 动态表达式变量** ```tcl ; 公式计算($a^2 + b^2$) Var.NEW &calc %Long "&reg_val * &reg_val + 0x10" ; 结构体成员访问 Var.Set &status %Byte &my_struct+4 ``` --- #### 二、实时监控与可视化 **1. 曲线绘制(实时波形)** ```tcl ; 设置采样参数 Var.PROfile.SETuptime 20 ; 20ms采样间隔 Var.PROfile.SETupaxis YMIN 0 YMAX 4095 ; Y轴范围 ; 启动监控 Var.PROfile &reg_val COLOR=GREEN TEXT="ADC_Value" Go ; 恢复目标运行 ``` ![寄存器曲线示例](https://www.lauterbach.com/frames/graphics/var_profile.png) *实时显示ADC采样值[^1]* **2. 多变量协同监控** ```tcl ; 同时监控三个传感器 Var.PROfile &sensor1 COLOR=RED Var.PROfile &sensor2 COLOR=BLUE Var.PROfile &sensor3 COLOR=GREEN ``` **3. 数据表格视图** ```tcl ; 显示变量历史记录 Var.View &reg_val HISTORY=100 ; 显示最近100次值 ``` > 支持导出为 CSV:`File > Export > Variable History` --- #### 三、高级调试功能 **1. 条件断点** ```tcl ; 当电压>3.0V时暂停 Break.Set Var.CONDition &voltage>3.0 ``` **2. 触发捕获** ```tcl ; 仅当温度>85°C时记录数据 Var.PROfile.SETup &temp TRIGGER="&temp>85" ``` **3. 脚本自动化** ```tcl ; 自动保存超标数据 WHILE (1) { IF (&voltage > 5.0) { Data.SAVE "OverVoltage.log" &voltage } WAIT 10ms } ``` --- #### 四、数据类型与转换 | 类型标识 | 说明 | 示例值 | |------------|---------------|---------------| | `%Byte` | 8位无符号整数 | `0xA5` | | `%Word` | 16位整数 | `-32768` | | `%Long` | 32位整数 | `0x1234ABCD` | | `%Float` | 单精度浮点 | `3.14159` | | `%Double` | 双精度浮点 | `2.71828` | | `%String` | ASCII字符串 | `"Error_42"` | **类型转换示例**: ```tcl ; 十六进制转浮点 Var.Set &float_val %Float &hex_val ``` --- #### 五、最佳实践 1. **性能优化** ```tcl ; 降低采样频率(避免拖慢实时系统) Var.PROfile.SETuptime 50 TIME.LIMIT 60 ; 仅采样60秒 ``` 2. **混合调试布局** ```tcl Screen.LAYout 3 ; 三窗口模式 List.Source ; 源码窗口 Register.View ; 寄存器窗口 Var.PROfile ; 曲线窗口 ``` 3. **数据验证技巧** ```tcl ; 交叉验证寄存器值 Data.View 0xFFE0D0AC ; 内存窗口查看原始值 PRINT "Var=" &reg_val "Mem=" *0xFFE0D0AC(%Long) ``` --- ### 数学关系说明 监控数据时需注意数值范围: - **整型变量范围**: $$ \text{取值范围} = \begin{cases} 0 \text{ 至 } 255 & (\text{%Byte}) \\ -32768 \text{ 至 } 32767 & (\text{%Word}) \\ -2^{31} \text{ 至 } 2^{31}-1 & (\text{%Long}) \end{cases} $$ - **浮点精度**: $$ \text{误差} < \frac{1}{2^{23}} \approx 1.19 \times 10^{-7} \quad (\text{%Float}) $$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值