1. 按地址查看符号表
y.list
2. Linux显示用户进程调用栈
一般情况下我们加载dump或者在线attach时只加载了Linux Kernel的符号表(vmlinux),此时只能看到内核空间的调用栈关系,如下图:
如果想显示用户空间的调用栈关系,可以这么做:
(1)点开菜单Linux->Display Processes,在任务列表里面找到当前的任务,点击右键选择Display Detailed,打开如下窗口:
(2)在code file选项卡中可以看到:libuClibc的开始地址为0xb6dde000,其它库文件的地址也都一起列了出来;
(3)加载dnsmasq主进程符号表 与 libuClibc 符号表
data.load.elf E:\RD\Trace32\0511\dnsmasq.elf /nocode /noclear (dnsmasq.elf 文件编译时已包含偏移地址0x8000,此时不需要再指定偏移)
data.load.elf E:\RD\Trace32\0511\libuClibc-0.9.33.2.so 0xb6dde000 /nocode /noclear (so文件为使用uClibc-0.9.33.2进行交叉编译后得到的elf文件)
(4)一般情况下加载上面两项后即可以看到用户进程的调用栈关系,如果有的地址还是无法解析,可以进一步加载对应地址的库文件的符号表。
3. Linux切换用户进程
一般情况下我们加载dump或者在线attach后只能看到当前用户进程的调用栈信息,如果想看其他任务的调用栈关系,可以这么做:
(1)点开菜单Linux->Display Processes,在任务列表里面找到当前的任务,点击右键选择Display Task Struct,打开如下窗口:
(2)读取该进程的一级页表基地址即PGD,具体路径为(task_struct) ->mm->pgd,得到PGD的虚拟地址;
(3)根据内核空间虚拟地址和物理地址的映射关系,将PGD转换为物理地址,例如映射关系为(0xc0000000<-->0x22300000),那么该PGD的物理地址为0x243e0000;
(4) 将转换后的PGD 物理地址写入TTBR0的基地址段([31:10]):
(5) 回到第一步的任务列表,右键点击要切换的目的任务,选择Switch Context, 此时就能看到该任务的调用栈关系:
(6) 如果还要进一步查看用户空间的调用栈关系,可以继续按照 Linux显示用户进程调用栈 的方法进行实现。