大致原因:數組越界,字符串操作越界,棧指針操作越界,操作了釋放掉了的指針,多線程時序對資源保護控制不當,內存管理異常,使用了其他地方的內存
定位方法:
1. 類似內存泄漏的問題,先定界,後定位,通過內存proc信息(meminfo/media-mem)判斷是具體的模塊,內存段
2. 減法縮小範圍,裁剪模塊,修改應用程序,找到最小場景
3. 加打印,打印出異常和懷疑的地址
4. gdb+watch 異常地址
5. valgrind+effence
6. 代碼深度檢視
個人認爲,踩內存最噁心了。要從源頭開始規避
1. 入參一定要做邊界檢查,防止溢出
2. 代碼不要嵌套太深,在多線程多通道的場景下,很容易重複釋放/申請資源
3. 不要定義過多的局部變量,數組,防止棧溢出,內核中棧的大小是8k吧。看情況使用kmalloc
4. 釋放了的資源及時置空,如果不是立馬就return的話。分支比較多的代碼,很容易就~~~
5. codeDex + codeCC 這些代碼檢視工具平時多跑跑,能發現大量低級問題的。這些低級問題往往要花幾天時間定位。