Lauterbach TRACE32技巧小集
1. TRACE32中实现类container_of功能
假设现在我只知道一个全局变量成员tv2的地址,类型是tvec_base。我想知道这个全局变量的地址怎么办?
struct tvec_base { spinlock_t lock; struct timer_list *running_timer; unsigned long timer_jiffies; unsigned long next_timer; struct tvec_root tv1; struct tvec tv2; struct tvec tv3; struct tvec tv4; struct tvec tv5; } ____cacheline_aligned;
1.1 计算tv2到结构体头的偏移量:&((struct tvec_base*)0x0)->tv2
可以得出tv2到结构体头的偏移量是0x080C
1.2 已知tv2的地址是0xC065C0CC,此地址减去偏移量就是tvec_bases的地址:(struct tvec_base *)(0xC065C0CC-0x080C)
如下就dump出了tvec_bases这个变量的内容。
2. 将内核变量导出到本地文件,如log_buf
2.1 首先找到Linux内核存放log的变量log_buf地址
2.2 执行data.SAVE.Binary D:\log.bin 0xC064B6AC++0x10000,dump从0xC064B6AC开始大小为0x10000一段内存到D:\log.bin中。
可以使用工具打开D:\log.bin文件。
更简单的方法是使用V.value(log_buf)获取基地址:
data.save.binary log.bin V.value(log_buf)++0x10000
3. system模式设置区别
打开system.state配置选项:
支持的Mode选项包括:
Down-关闭调试模式,CPU的状态未改变。
NoDebug-复位系统并关闭调试模式。
Prepare
Go-复位系统并关闭调试模式,然后系统开始运行知道满足暂停/停止条件。
Attach-程序继续执行(不会复位),并且激活调试模式。此命令之后程序可以通过break或者任何满足暂停的条件停止执行。
Standby-等待目标电源和时钟。当两者都可用,立即开始执行。
Up-复位系统并使能调试,在第一个取指前停止。