1. 程式人生 > >記憶體被錯誤改變,越界寫的分析

記憶體被錯誤改變,越界寫的分析

1. malloc會造成記憶體洩漏,但是記憶體越界寫主要是有memcpy造成

2. log如果能夠打印出來,一個連續變化的整數i++的列印,如果12345 89,跳過6,那麼當i是5時,可能被其他程式碼越界改為8,導致無法打印出6和7

log只會全部打印出來或者全部不能列印;如果能夠列印,即使是多執行緒,只會出現交叉列印,但是不會出現部分log完全不列印的情況,就像i連續變化,6和7不列印,那麼可能是程式碼邏輯問題(上述情況是ii被越界寫了)

log太多的時候,即使adb logcat > file也有可能部分log打印不出來,所以應該去除掉過分冗餘的log

3. malloc、free、memcpy可以用巨集進行重定義,以便於除錯

4.  常量定義後,使用的地方改成:直接使用數字/字串,是禁止的行為,可能導致記憶體越界等非常難除錯的問題

5. c語言的執行緒棧中的區域性變數最好不要超過100個位元組,否則用malloc分配空間或者定義位常量,不然執行緒會詭異的死掉,沒有backtrace,沒有log,比較難除錯

6. 同一常量的定義不能在兩個用的檔案中定義兩次

7. 發現問題,立即解決,不然越積累越複雜

8. 只在開源c/c++程式碼已有的資料結構中增加了一個變數,並set/get一下,就發生了以下錯誤(這類問題看起來很頭痛):

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8

原因:

可能程式碼中有相當資料結構起始位置的運算,但是講新加的變數放在資料結構的開頭了

解決辦法:

1. 新增資料時,最好另外新增資料結構,而不是修改已有資料結構

2. 當只能修改資料結構時,請新增在資料結構末尾(例如ffmpeg新增新的資料結構,不能編譯通過(怎麼能編譯通過的方法估計要花時間看文件,暫時沒有找到),只能在已有資料結構中新增變數以節省開發時間)

9. log太多,logcat會出現read unexpected EOF的錯誤,因此儘量避免瞬時出現大量log,導致logcat系統處理不了,出現異常