1. 艱辛的過程
最近做了一個嵌入式的項目,需要與伺服器進行連接配接。為了友善伺服器處理資料,經商定後統一采用JSON形式進行資料的傳輸。
以前沒有用過JSON格式進行資料處理,是以上網搜尋了一下,很多人推薦使用Dave Gamble的cJSON,然後下載下傳到了:
源碼1
源碼2
開始使用,覺得很爽!
洋洋灑灑寫了近萬行的代碼,調試過後,沒發現明顯bug,心裡很樂呵,覺得自己coding老牛逼了!
劇情到這裡翻轉了~~~~~~
- 代碼跑着跑着,發現記憶體一直在持續攀升
- 記憶體達到一定的數字,程式莫名其妙的卡死了
各種找bug,各種調試,甚至開始一行行的注釋掉代碼,每次複現bug需要跑一兩個小時不等,就這麼被痛苦的折磨了三天,能用的方法幾乎用遍了,什麼mtrace,什麼gdb,什麼打log,每次卡死的地方都不同,感覺自己不愛了!
最終實在是沒有辦法了,我知道是記憶體洩漏了,但是就是不能定位到底是哪裡洩漏了,感覺每次New之後都delete了,連結清單也循環釋放了,沒天理了!
2. Bug定位
抱着死馬當活馬醫的心态,我通讀了cJSON代碼,終于發現了錯誤,隻是因為少看了一行注釋!
原來,cJSON_Print也是配置設定記憶體的,需要手動去釋放掉,唉!
解決記憶體洩漏問題,繼續跑,發現程式還是卡死,奇怪了!
繼續查,終于發現了,做了一個定時函數,定時發送狀态資訊給server,發就發呗,關鍵發送的時候同樣調用了cJSON_CreateObject函數,裡面可是有malloc的啊!
改正,繼續運作,問題解決!
3. 結論教訓
- 使用網絡開源代碼,一定要注意别人寫的注釋,說不定一不小心你就掉坑裡了
- 中斷處理函數中,一定不要使用malloc/free new/delete 等一些耗時的系統函數,不然後續肯定會死的很難看