cJSON填坑記


1. 艱辛的過程

最近做了一個嵌入式的項目,需要與服務器進行連接。為了方便服務器處理數據,經商定后統一采用JSON形式進行數據的傳輸。
以前沒有用過JSON格式進行數據處理,所以上網搜索了一下,很多人推薦使用Dave Gamble的cJSON,然后下載到了:

源碼1
源碼2

開始使用,覺得很爽!
洋洋灑灑寫了近萬行的代碼,調試過后,沒發現明顯bug,心里很樂呵,覺得自己coding老牛逼了!

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

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

各種找bug,各種調試,甚至開始一行行的注釋掉代碼,每次復現bug需要跑一兩個小時不等,就這么被痛苦的折磨了三天,能用的方法幾乎用遍了,什么mtrace,什么gdb,什么打log,每次卡死的地方都不同,感覺自己不愛了!
最終實在是沒有辦法了,我知道是內存泄漏了,但是就是不能定位到底是哪里泄漏了,感覺每次New之后都delete了,鏈表也循環釋放了,沒天理了!

2. Bug定位

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

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

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

mark

mark

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

3. 結論教訓

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM