現象:挂死,程式跑的異常,資料被串改
大緻原因:數組越界,字元串操作越界,棧指針操作越界,操作了釋放掉了的指針,多線程時序對資源保護控制不當,記憶體管理異常,使用了其他地方的記憶體
定位方法:
1. 類似記憶體洩漏的問題,先定界,後定位,通過記憶體proc資訊(meminfo/media-mem)判斷是具體的子產品,記憶體段
2. 減法縮小範圍,裁剪子產品,修改應用程式,找到最小場景
3. 加列印,列印出異常和懷疑的位址
4. gdb+watch 異常位址
5. valgrind+effence
6. 代碼深度檢視
個人認為,踩記憶體最惡心了。要從源頭開始規避
1. 入參一定要做邊界檢查,防止溢出
2. 代碼不要嵌套太深,在多線程多通道的場景下,很容易重複釋放/申請資源
3. 不要定義過多的局部變量,數組,防止棧溢出,核心中棧的大小是8k吧。看情況使用kmalloc