cJSON填坑記

1. 艱辛的過程

最近作了一個嵌入式的項目,須要與服務器進行鏈接。爲了方便服務器處理數據,經商定後統一採用JSON形式進行數據的傳輸。
之前沒有用過JSON格式進行數據處理,因此上網搜索了一下,不少人推薦使用Dave Gamble的cJSON,而後下載到了:git

源碼1
源碼2github

開始使用,以爲很爽!
洋洋灑灑寫了近萬行的代碼,調試事後,沒發現明顯bug,內心很樂呵,以爲本身coding老牛逼了!json

劇情到這裏翻轉了~~~~~~服務器

  1. 代碼跑着跑着,發現內存一直在持續攀升
  2. 內存達到必定的數字,程序莫名其妙的卡死了

各類找bug,各類調試,甚至開始一行行的註釋掉代碼,每次復現bug須要跑一兩個小時不等,就這麼被痛苦的折磨了三天,能用的方法幾乎用遍了,什麼mtrace,什麼gdb,什麼打log,每次卡死的地方都不一樣,感受本身不愛了!
最終實在是沒有辦法了,我知道是內存泄漏了,可是就是不能定位究竟是哪裏泄漏了,感受每次New以後都delete了,鏈表也循環釋放了,沒天理了!網絡

2. Bug定位

抱着死馬當活馬醫的心態,我通讀了cJSON代碼,終於發現了錯誤,只是由於少看了一行註釋!
mark函數

原來,cJSON_Print也是分配內存的,須要手動去釋放掉,唉!.net

解決內存泄漏問題,繼續跑,發現程序仍是卡死,奇怪了!
繼續查,終於發現了,作了一個定時函數,定時發送狀態信息給server,發就發唄,關鍵發送的時候一樣調用了cJSON_CreateObject函數,裏面但是有malloc的啊!調試

mark

mark

改正,繼續運行,問題解決!server

3. 結論教訓

  1. 使用網絡開源代碼,必定要注意別人寫的註釋,說不定一不當心你就掉坑裏了
  2. 中斷處理函數中,必定不要使用malloc/free new/delete 等一些耗時的系統函數,否則後續確定會死的很難看
相關文章
相關標籤/搜索