辉哥给rockchip修复了一个内存溢出问题

共 1161字,需浏览 3分钟

 ·

2022-01-10 12:06







还是周末


我也不想说周末,但是不是周末的话,可能也没有特别清净的时间来处理困难的问题。这周末我是要加班的,加班的前一个晚上,我领导找我们吃了一个便饭,聊了很多东西,这篇文章我就不说了,会在下篇文章来讲这个事情,这篇文章就讲修复的内存溢出的问题。


问题出现的现象


现象是我们测试发现,晚上在不断的运行后会出现重启,而且是每隔1个小时左右就会重启。


然后我们拿到了日志分析,发现每次重启前都会出现 Out of memory,这里感谢guanxi同学,我那时候还没有注意,他给我指出来了。


OOM会导致系统把占用内存最大的进程给kill掉,如果连续3次OOM,就会导致重启。


当然,你也可以设置阈值来修改这些配置,如下,可以修改触发OOM的门限



echo -100 > /proc/$PID/oom_score_adj



分析问题


因为每次出现后都是会干掉我们的应用程序,我们先把应用程序分析了一遍,最后发现把我们的应用程序干掉还是会出现内存溢出。



export TERM=linux
htop



关于htop的用法大家可以去自己体验一下,里面有非常多的配置,可以看到很多关于系统的内容。


在htop界面,可以清晰的看到内存一点一点的增加。


所以,不是应用的问题。


系统部分分析


然后我回退代码,发现是一个HID的修改增加导致的,这个修改是和HID增加mute相关的。


再观察日志的时候,在正常的情况下,内核不会反复打印某条日志。


然后就用上了抓包工具wireshark,这个工具不仅可以抓网络包,还可以抓USB包。


抓到包后,发给我的同事辉哥,辉哥分析后是因为代码里面没有对这种异常情况进行判断。


so,加上这部分的判断就可以了。


非常感谢guanxi给我们提供了另外一种USB抓包工具


如果大家想获取,可以在公众号后台回复「USB抓包工具



关于这个问题的一些思考


刚开始我想找到某个线程的内存异常,但是线程的内存和进程是共享的,所以一个进程开了20个线程,每个线程体现的都是进程的内存大小,看起来并没有差异。而且我在查看进程内存的时候,发现进程的内存并没有增加,这时候我就应该转变方向了。


rockchip的很多代码写的都很好,但是在实际的应用场景上,会遇到各种各样的问题,我们这次的修改,也是因为在这款设备上面出现的差异,在其他设备上是没有问题的,但是要想去排查所有的硬件差异后根除,那可能比修改代码更加困难。


抓日志分析一定是最好的解决问题的方式,在遇到问题前,还是要先找出问题差异点,从差异点去分析。


最后还是辉哥,yyds。




浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报