crash调试内核模块

 WIFI 模块出现panic时,怎么根据fulldump去分析wifi问题,以及怎么调试wlan的ko文件?

这里介绍Linux下的crash工具来分析fulldump,当然也可以用trace32,gdb等其他工具.

1. 安装crash工具

 下载代码:git clone  https://github.com/crash-utility/crash.git

   编译和安装:make target=ARM64;make install

2. crash工具加载fulldump文件

    加载指令: crash /path_name/vmlinux --kaslr=0x4de600000 --machdep kimage_voffset=0xffffff8466600000 DDRCS0_0.BIN@0x80000000,DDRCS0_1.BIN@0x100000000,DDRCS1_0.BIN@0x140000000,DDRCS1_1.BIN@0x1c0000000

注意事项:2.1 需要指定kaslr和 kimage_voffset的值,crash才能正常加载dump.

               2.2 每个DDR文件后面需要跟起始物理地址

3. crash工具分析wlan ko文件

 由于wlan驱动是以ko形式添加到系统中,所以还需要在crash命令行手动加载wlan.ko

根据第二步进入crash交互后,输入wlan.ko文件的路径

crash> mod -s wlan  /home/xxx/disk/main/test/log/0708/wifi/debug/wlan/qca_cld3_wlan.ko.unstripped

显示加载成功的界面:

 

4. 案例分析

加载wlan.ko文件后,可以进行crash调试

4.1 显示pc指针对应行号 :sym指令

 

可以看出,最后panic在1345行,通过代码,初步推断pBssDesc这个结构访问出现异常

 

4.2 查看pBssDesc变量内容

 要查看变量内容,必须先找到pBssDesc的地址.代码中有pBssDesc->ieFields的寻址,

通过crash指令得到ieFields在结构体中的偏移量:crash> struct tSirBssDescription -ox,得知ieFields的偏移量为0x1b0

反汇编函数csr_get_parsed_bss_description_ies有如下汇编语句:

crash> dis csr_get_parsed_bss_description_ies

 

add x1,x19 ,#0x1b0 得知,寄存器x19就是pBssDesc的地址. 从kernel oops中得到x19的值为0xffffffc38a3230b0

就可以用crash指令p或者struct打印内存:

可以看到pBssDesc内存全部为0xaa,0xaa在内核中表示已经调用free_page释放内存,从这里可以得出结论,pBssDesc已经被释放了

这是典型的use after free问题.通过代码就可以知道释放和分配的地方,从而找到问题原因

 

5. 常见crash指令

可以直接看说明文档:https://people.redhat.com/anderson/help.ht

查看所有的tcp/udp连接

foreach net -s

显示block状态进程堆栈

foreach UN bt
显示所有进程的bt
foreach bt //显示所有
foreach ps //显示所有进程
foreach  pid vm //显示进程的虚拟内存
 

显示内存信息

kmem -i

kmem -s /*显示slab */

rd address /* 读取内存*/

directory /* 指定目录*/
 

显示结构体:
struct struct_name address
timer //显示系统中的
runq://显示系统所有runq信息:

p //用p打印内存或者结构体
dis//反汇编
rd//读内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值