作为一个安卓驱动开发,在和工厂沟通过程中经常收到机器在开机后直接进sysdump的问题反馈。最开始碰到这种问题,自己也基本上是满脸问号。后来经过一些错误排查后逐渐有了处理经验。在这里做个简单的分享。
下面以一次实例来讲解:
问题描述:出现一台机器在系统启动后不久就自己重启进入sysdump界面。再次开机后大概率会继续进入sysdump。
后面拿到了问题机器。
我们自己需要准备和异常机器使用固件版本对应的vmlinux,另外还要准备好crash分析工具,由于机器时基于ARM核心的,所以用的是crash_arm工具。
将sysdump文件和vmlinux还有crash_arm复制到一个文件夹中,方面后续操作:
运行命令将sysdump信息解析出来:
1 * > logcat
2 ./crash_arm vmlinux logcat
如果解析有异常,命令行里面会有提示。解析成功后如下图:
到这里,我们可以看到显示这个sysdump的问题是发生了空指针异常:
那现在知道了问题的原因,但是还不知道具体的问题点在哪里。这种问题属于解决难度适中的情况。
更简单下的情况下,sysdump解析出来的问题直接会指出问题出在哪个函数。而另外一种更麻烦的情况下,这里解析出的错误可能会显示为空,如果碰到这种情况就比较棘手。
回到这个问题本身,造成空指针异常的可能原因很多,因此我们需要进一步查找原因。这是我一般先会将sysdump的log信息导出来。使用如下命令:
导出后查看这个文件的内容。
我们在文件中搜索前面提到的问题原因:
从这里我们可以看到很多寄存器的信息。其中最重要的是PC寄存器的内容,
到这里我们思路就很清晰了,通过查看unlink_anon_vmas函数的汇编代码,找到其中位于0x170偏移地址的代码内容,就找到了问题的根本原因。
这时需要用到crash_arm工具,我们通过dis反汇编命令进行解析:
得到结果如下:
看到这密密麻麻的汇编代码不要怂,上去跟他刚。
由于解析出来的汇编代码偏移地址用的十进制,所以0x170就对应上图中最后红色箭头指出的这一行代码。
为了验证这个猜测,我们需要知道当下r2寄存器的值。这里我们需要回到前面的这个图片:
那问题分析到这里,我们已经知道了问题点,但是还不清楚为什么会导致这个问题,下面还要接着分析:
现在就要结合问题点的代码上下文来进行进一步分析了,既然是r2寄存器的内容不对,那么我们需要查看r2寄存器的值的来源,通过汇编代码可以看出:
0xc011eb94 <unlink_anon_vmas+364>: ldr r2, [r4, #8]
0xc011eb98 <unlink_anon_vmas+368>: str r3, [r2, #4]
非常感谢大家的耐心阅读。
公众号里我会根据基础技术制作出有趣的东西,我们一起体会技术的乐趣
本文发布于:2024-01-31 17:42:44,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170669416730257.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |