内核、系统启动崩溃分析

MTK把内核panic转化为文件和行号的方法:http://blog.chinaunix.net/uid-29728680-id-5736563.html
例如系统启动过程中,内核log中有一下错误
[ 3.990587] <4>.(4)[1:swapper/0]Unable to handle kernel NULL pointer dereference at virtual address 00000002
。。。。。。。
[ 4.091485] <4>-(4)[1:swapper/0]task: ffffffc07954a000 ti: ffffffc07954c000 task.ti: ffffffc07954c000
[ 4.092642] <4>-(4)[1:swapper/0]PC is at da9214_read_byte+0x4c/0xd4
[ 4.093418] <4>-(4)[1:swapper/0]LR is at da9214_read_byte+0x38/0xd4
[ 4.094197] <4>-(4)[1:swapper/0]pc : [<ffffffc00048792c>] lr : [<ffffffc000487918>] pstate: 60000045
[ 4.095335] <4>-(4)[1:swapper/0]sp : ffffffc07954f910

分析过程:
1.由[ 3.990587] <4>.(4)[1:swapper/0]Unable to handle kernel NULL pointer dereference at virtual address 00000002可以知道,错误出现在内核中:
Unable to handle kernel-------------->错误出现在内被
Unhandled page fault---------------->错误出现在系统应用层。
2.由PC,lR中的的函数可以知道内核错误的具体位置。
3.如果没有列出函数名称,可以由lr : [<ffffffc000487918>]中的地址在system.map文件中找到相对于的函数
4.可以用arm-linux-objdump -D test_debug > test_debug.dis/arm-none-eabi-objdump反编译内核模块生成的ko/o文件,根据da9214_read_byte+0x4c/0xd4里面的偏移量找到是函数中的具体哪行代码。
5.应用执行过程中如果出错,也可以反编译找出出错的函数位置。

由PC地址:
[ 2.876681] <1>-(1)[1:swapper/0]Hardware name: MT6797 (DT)
[ 2.877366] <1>-(1)[1:swapper/0]task: ffffffc07c54a000 ti: ffffffc07c54c000 task.ti: ffffffc07c54c000
[ 2.878521] <1>-(1)[1:swapper/0]PC is at DAL_SetScreenColor+0x70/0xa0
[ 2.879320] <1>-(1)[1:swapper/0]LR is at DAL_SetScreenColor+0x5c/0xa0
[ 2.880121] <1>-(1)[1:swapper/0]pc : [<ffffffc000528760>] lr : [<ffffffc00052874c>] pstate: 80000045
[ 2.881258] <1>-(1)[1:swapper/0]sp : ffffffc07c54fb80

得到
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -Cfe out/target/product/feima6797_4u_m/obj/KERNEL_OBJ/vmlinux 0xffffffc000528760
DAL_SetScreenColor
/home/zhangwp/work/HuBa/newhuba_test_258_0603/kernel-3.18/drivers/misc/mediatek/video/mt6797/videox/disp_assert_layer.c:149

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章