pc : [<bf0000b8]
1.定位代码崩溃在内核中还是xxx.ko
cat /proc/kallsyms >1.txt
c0034818 T __kmalloc
...
c00082a8 t quiet_kernel /*最开始的是虚拟地址*/
...
bf000000 t $a [cdd]
..
由此可看代码崩溃在xxx.ko
2.定位崩溃在xxx.ko中的哪个函数
arm-linux-objdump -D cdd.ko >2.txt
00000000 <cdd_llseek>
0: e1a0c00d mov ip,sp //编译地址,编译后的指令,汇编语言编译地址+0xbf000000 = 存放地址
0000009c <cdd_open>
9c: e1a0c00d mov ip,sp
a0: e92dd8f0 push {r4,r5,r6,r7,fp,ip,lr,pc}
...
b8: e5c43000 strb r3,[r4] ------此处出现问题
由此知道崩溃在cdd_open函数
3. 反汇编内核代码了解cdd_open被调用流程
arm-linux-objdump -D vmlinux >3.txt
cdd_open压栈,push {r4,r5,r6,r7,fp,ip,lr,pc}
这8个数据就是你要压的数据,lr寄存器的值是函数调用完要返回的地址
根据lr,查看上一次调用cdd_open的函数
以此类推,可以得到调用流程