zoukankan      html  css  js  c++  java
  • 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 等一些耗时的系统函数,不然后续肯定会死的很难看
  • 相关阅读:
    2018年9月28日CCPC秦皇岛站参赛总结
    数学:二次剩余与n次剩余
    数学:拓展Lucas定理
    BZOJ2301:莫比乌斯反演+二维容斥解决GCD范围计数
    数学:莫比乌斯反演-约数个数和
    数学:莫比乌斯反演-GCD计数
    关于cnblogs至github上blog的搬迁
    友链——一群dalao
    折半搜索(meet in the middle)
    关于爆搜
  • 原文地址:https://www.cnblogs.com/Jimmy1988/p/9629867.html
Copyright © 2011-2022 走看看