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//读内存