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 等一些耗时的系统函数,否则后续确定会死的很难看
相关文章
相关标签/搜索