kernel panic 时通常会打出call trace 函数相关调用信息,例如
[<0000000000000000>] SyS_epoll_wait+0x2a0/0x324
通过vmlinux和nm/addr2line可以判断出问题时死掉的函数具体位置
过程如下:
(1)首先,获取符号地址,比如获取epoll_wait的符号地址:
arm-eabi-nm xxxxxx/vmlinux |grep epoll_wait
该命令执行后,可获取sys_epoll_wait命令的符号地址,如下c02b2f28 T sys_epoll_wait
2)然后,计算地址
例如 [<0000000000000000>] SyS_epoll_wait+0x2a0/0x324
则计算后的地址c02b2f28 + 2a0 = 目标地址。而对于kernel来说都是通过vmlinux来获取的,这时再执行命令可转换函数名
./aarch64-linux-android-addr2line -Cfe /xxxx/vmlinux [目标地址]
3)根据计算出的函数找到code中的具体实现,查找报错原因。
备注:
nm及更多objdump的用法参考:
https://www.cnblogs.com/hehehaha/p/6332331.html