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

扫描二维码关注公众号,回复: 3703735 查看本文章

根据第二步进入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

猜你喜欢

转载自blog.csdn.net/bin_linux96/article/details/81018372