嵌入式技术william hill官网
直播中

李红

7年用户 1265经验值
私信 关注
[问答]

怎么去解决paho mqtt和mymqtt的内存泄露问题呢?

我在使用paho mqtt和mymqtt这两个软件包的时候,存在内存泄露问题。

每次mqtt发送数据前后后,用free查看内存
发送前内存情况:

total memory: 441216
used memory : 46092
maximum allocated memory: 46768

发送Mqtt数据4次

massage lenth:52
massage lenth:52
massage lenth:52
massage lenth:52

发送后内存情况:

total memory: 441216
used memory : 46780
maximum allocated memory: 47456

可以看到used memory在缓慢增加,如果数据量一大,运行一段时间后就必然占满内存导致报错。

请问大家,有没有遇到这样的情况?要如何解决,或者有什么其他mqtt的包推荐,不会有这样的问题?

回帖(4)

李超

2023-2-1 16:03:36
可以继续发下去再看。
同时结合memtrace来检查是谁在泄露。
我感觉是你的代码中,数据本身在泄露!
举报

李红

2023-2-1 16:03:50
只要不使用mqtt上传,程序在运行就内存就是稳定的。
而且只使用mqtt的例程去传输数据,内存就会每次都增加。也是很奇怪
举报

李超

2023-2-1 16:04:11
经过检查发现,并不是paho mqtt和mymqtt的软件包有泄露内存的问题,而是我自己用Cjson产生数据的时候,导致的内存泄露,代码可以参如下。

char *JSONMakeFrame(void)
{
    char *p;
    char string[20] = {0};
    cJSON *json_root = cJSON_CreateObject(); /* 创建根索引 json 对象 */
    cJSON_AddStringToObject(json_root, "id", "xxx");
    cJSON_AddStringToObject(json_root, "sn", "xxxx");
    p = cJSON_PrintUnformatted(json_root);/* 生成无格式 json 字符串 */
    free(p);  //这个free(p),这样用不知道有没有问题,目前我的程序是没问题,但是不用还是内存会泄露
    cJSON_Delete(json_root); //此处一定要释放申请的内存。如果有其他的cJSON也要一并释放
    return p;
}
到现在我用过了paho-mqtt,my-mqtt,kawaii-mqtt
paho-mqtt使用中还是会有hard falut产生,
ma-mqtt目前情况还行,看看后面会不出问题
kawaii-mqtt,在RTT上运行,能连接通讯,会报AT socket timeout的错,后面没有继续使用。
举报

陈秀英

2023-2-1 16:04:18
应该用cJSON_free来释放你打印JSON的那个字符串所占用的内存,会好点
举报

更多回帖

发帖
×
20
完善资料,
赚取积分