在前文中,我們已經詳細闡述了合宙基于移芯平臺的模塊遭遇死機問題的根源探尋策略與解決路徑的構建。
今天,我們將進一步深耕細作,聚焦內存死機這一具體現象,探討其背后的原因以及相應的解決策略。
本文檔適用于合宙Air780E、Air780EP、Air780EQ、Air201
關聯文檔和使用工具:
移芯平臺模塊出現死機問題分析
EPAT抓取底層日志
一、從Ramdump里分析內存泄漏問題
對于遇到內存不足死機的問題,可以從ramdump里找出哪些函數在消耗ram。
進入trace32后,在自動彈出下發圖片的窗口里能找到哪個函數在哪個task里用了多少ram沒有歸還,如果遇到哪個API大量申請了ram沒有歸還,基本上就是問題點了
為了查找方便,在trace_node選擇某個數據,框里面右鍵 -> 點擊format
上圖里看到0x00868909 這個API在消耗大量的ram,從map文件,或者從trace_32工具菜單 view -> symbols -> browes 里搜索,Ctrl+F,或者Cov - > list functions,就能找到函數名稱。
這樣查找問題解答方向上 就相對明確了。
二、從Ramdump里分析棧溢出
需要檢查下trace32里有沒有freertos文件夾,如果沒有可以在這里下載放到根目錄freertos
一般來說,棧溢出會有斷言的情況,但是也有代碼申請了一大塊??臻g,導致棧底的ram沒有被改變,但是實際上代碼已經操作了棧外空間,且freertos不會報錯,燃石在trace32里能分析出來。
打開trace32 -> freertos -> stack Coverage -> List Stacks
可以看到ram使用情況,注意這里認為棧空間只有1KB,但是實際上可能是遠超的,不過沒關系,如果max里是0%,說明還有很多??臻g,不用去管
Tmr Svc這個task居然用到了93%
右鍵點擊紅框,在彈出菜單里選擇display memory->dump
距離溢出只有不到70字節,如果用戶代碼里有類似uint8_t temp[71],那么很容易就操作了棧外的ram,死機就很正常了
詳細資料獲取請點擊: www.openluat.com
審核編輯 黃宇
-
內存
+關注
關注
8文章
3019瀏覽量
74003 -
死機
+關注
關注
0文章
17瀏覽量
8597
發布評論請先 登錄
相關推薦
評論