LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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-复位系统并使能调试,在第一个取指前停止。

posted on 2017-07-20 20:13  ArnoldLu  阅读(7098)  评论(0编辑  收藏  举报

导航