kernel apanic介绍
apanic属于内核级别的异常,log打印出的是堆栈地址。apanic一般是死机重启的问题,常见空指针(null pointer)或地址加载异常,一般都与cpu稳定性相关。
常见的错误类型:
|
|
apanic log例如:
|
|
上面的log我们可以看到进程栈,以及栈帧(stack frame)调用关系。还可以看到此时各寄存器对应的值。(关于 stack和 stack frame以后会介绍)
我们可以对vmlinux进行反编译,获取堆栈地址对应的函数信息。gdb是我们常用的反编译工具,其他反编译如IDA也可以尝试。
相关工具及基本认识
SP(R13)堆栈指针, 指向异常模式所专用的堆栈
LR(R14)连接寄存器
- 用来存放子程序返回地址
- 异常发生时保存异常返回地址(一般为PC减去0x04或0x02)
PC(R15)存放当前指令地址
(此处后面会补充常用汇编命令和R1-R15寄存器意义)
Android源码中自带gdb调试工具(不同的Android版本可能位置不同):
Android版本对应的vmlinux:
gdb 反编译常用命令
加载symbol文件
|
|
反编译函数形成汇编语言
|
|
利用加假断点可以查看对应代码位置与行号
|
|
查看函数信息
|
|
我们可以利用反编译可以很轻松的查到对应的代码调用信息。根据反汇编函数可以看到对应寄存操作,在panic问题出现时一般会打印此时所有寄存器的值,我们可以在反汇编的基础上来推算运算值是否准确,从计算的结果可以方便的判断出计算值是否发生bitflip,也可以知道cpu的ALU计算单元错误,这和cpu的设计和稳定性相关。