辉哥给rockchip修复了一个内存溢出问题
還是周末
我也不想說周末,但是不是周末的話,可能也沒有特別清凈的時間來處理困難的問題。這周末我是要加班的,加班的前一個晚上,我領(lǐng)導(dǎo)找我們吃了一個便飯,聊了很多東西,這篇文章我就不說了,會在下篇文章來講這個事情,這篇文章就講修復(fù)的內(nèi)存溢出的問題。
問題出現(xiàn)的現(xiàn)象
現(xiàn)象是我們測試發(fā)現(xiàn),晚上在不斷的運行后會出現(xiàn)重啟,而且是每隔1個小時左右就會重啟。
然后我們拿到了日志分析,發(fā)現(xiàn)每次重啟前都會出現(xiàn) Out of memory,這里感謝guanxi同學(xué),我那時候還沒有注意,他給我指出來了。
OOM會導(dǎo)致系統(tǒng)把占用內(nèi)存最大的進程給kill掉,如果連續(xù)3次OOM,就會導(dǎo)致重啟。
當(dāng)然,你也可以設(shè)置閾值來修改這些配置,如下,可以修改觸發(fā)OOM的門限
分析問題
因為每次出現(xiàn)后都是會干掉我們的應(yīng)用程序,我們先把應(yīng)用程序分析了一遍,最后發(fā)現(xiàn)把我們的應(yīng)用程序干掉還是會出現(xiàn)內(nèi)存溢出。
關(guān)于htop的用法大家可以去自己體驗一下,里面有非常多的配置,可以看到很多關(guān)于系統(tǒng)的內(nèi)容。
在htop界面,可以清晰的看到內(nèi)存一點一點的增加。
所以,不是應(yīng)用的問題。
系統(tǒng)部分分析
然后我回退代碼,發(fā)現(xiàn)是一個HID的修改增加導(dǎo)致的,這個修改是和HID增加mute相關(guān)的。
再觀察日志的時候,在正常的情況下,內(nèi)核不會反復(fù)打印某條日志。
然后就用上了抓包工具wireshark,這個工具不僅可以抓網(wǎng)絡(luò)包,還可以抓USB包。
抓到包后,發(fā)給我的同事輝哥,輝哥分析后是因為代碼里面沒有對這種異常情況進行判斷。
so,加上這部分的判斷就可以了。
非常感謝guanxi給我們提供了另外一種USB抓包工具
如果大家想獲取,可以在公眾號后臺回復(fù)「USB抓包工具」
關(guān)于這個問題的一些思考
剛開始我想找到某個線程的內(nèi)存異常,但是線程的內(nèi)存和進程是共享的,所以一個進程開了20個線程,每個線程體現(xiàn)的都是進程的內(nèi)存大小,看起來并沒有差異。而且我在查看進程內(nèi)存的時候,發(fā)現(xiàn)進程的內(nèi)存并沒有增加,這時候我就應(yīng)該轉(zhuǎn)變方向了。
rockchip的很多代碼寫的都很好,但是在實際的應(yīng)用場景上,會遇到各種各樣的問題,我們這次的修改,也是因為在這款設(shè)備上面出現(xiàn)的差異,在其他設(shè)備上是沒有問題的,但是要想去排查所有的硬件差異后根除,那可能比修改代碼更加困難。
抓日志分析一定是最好的解決問題的方式,在遇到問題前,還是要先找出問題差異點,從差異點去分析。
最后還是輝哥,yyds。
總結(jié)
以上是生活随笔為你收集整理的辉哥给rockchip修复了一个内存溢出问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于tensorflow的iris数据集
- 下一篇: 行业精英解答十大游戏关卡设计问题