天天看點

cJSON填坑記

1. 艱辛的過程

最近做了一個嵌入式的項目,需要與伺服器進行連接配接。為了友善伺服器處理資料,經商定後統一采用JSON形式進行資料的傳輸。

以前沒有用過JSON格式進行資料處理,是以上網搜尋了一下,很多人推薦使用Dave Gamble的cJSON,然後下載下傳到了:

源碼1

源碼2

開始使用,覺得很爽!

洋洋灑灑寫了近萬行的代碼,調試過後,沒發現明顯bug,心裡很樂呵,覺得自己coding老牛逼了!

劇情到這裡翻轉了~~~~~~

  1. 代碼跑着跑着,發現記憶體一直在持續攀升
  2. 記憶體達到一定的數字,程式莫名其妙的卡死了

各種找bug,各種調試,甚至開始一行行的注釋掉代碼,每次複現bug需要跑一兩個小時不等,就這麼被痛苦的折磨了三天,能用的方法幾乎用遍了,什麼mtrace,什麼gdb,什麼打log,每次卡死的地方都不同,感覺自己不愛了!

最終實在是沒有辦法了,我知道是記憶體洩漏了,但是就是不能定位到底是哪裡洩漏了,感覺每次New之後都delete了,連結清單也循環釋放了,沒天理了!

2. Bug定位

抱着死馬當活馬醫的心态,我通讀了cJSON代碼,終于發現了錯誤,隻是因為少看了一行注釋!

原來,cJSON_Print也是配置設定記憶體的,需要手動去釋放掉,唉!

解決記憶體洩漏問題,繼續跑,發現程式還是卡死,奇怪了!

繼續查,終于發現了,做了一個定時函數,定時發送狀态資訊給server,發就發呗,關鍵發送的時候同樣調用了cJSON_CreateObject函數,裡面可是有malloc的啊!

改正,繼續運作,問題解決!

3. 結論教訓

  1. 使用網絡開源代碼,一定要注意别人寫的注釋,說不定一不小心你就掉坑裡了
  2. 中斷處理函數中,一定不要使用malloc/free new/delete 等一些耗時的系統函數,不然後續肯定會死的很難看

繼續閱讀