【问题标题】:Segmentation fault while MQTTClient_setCallbacksMQTTClient_setCallbacks 时出现分段错误
【发布时间】:2021-11-25 09:41:43
【问题描述】:

我有来自 hivemq 站点的 simpe MQTT 客户端应用程序:

MQTTClient client;
MQTTClient_create(&client, "ssl://xxx.s1.eu.hivemq.cloud:8883", "Client_1", MQTTCLIENT_PERSISTENCE_NONE, NULL);
    
int i = MQTTClient_setCallbacks(client, NULL, NULL, messageArrived, NULL);

在变量 m->c->connect_state 中设置回调时出现分段错误

MQTTClient.c 代码分段错误:

int MQTTClient_setCallbacks(MQTTClient handle, void* context, MQTTClient_connectionLost* cl, MQTTClient_messageArrived* ma, MQTTClient_deliveryComplete* dc)
{
    int rc = MQTTCLIENT_SUCCESS;
    MQTTClients* m = handle;

    FUNC_ENTRY;
    Thread_lock_mutex(mqttclient_mutex);

    if (m == NULL || ma == NULL || m->c->connect_state != NOT_IN_PROGRESS)
...
}

【问题讨论】:

  • 这与您昨天提出的问题有何不同? stackoverflow.com/questions/70101845/…
  • 你需要检查这个MQTTClient_create的结果,看看是否成功。
  • 您已经被告知 m->c 在您的其他问题中可能是 NULL。您仍然不检查是否是这种情况。为什么?
  • 代码很混乱:MQTTClient 是结构体。您传递整个结构,然后调用它handle。然后将其分配给MQTTClients 指针。 MQTTClientsMQTTClient 的类型是什么?代码可以编译吗?
  • MQTTClient_setCallbacks 中的可疑分配不是罪魁祸首,而是传递给该函数的参数之一。这就是为什么我说你需要检查MQTTClient_create 的结果才能看到它没问题。同样,一旦进入MQTTClient_setCallbacks,您应该能够检查m 并在那里获取整个结构 - 成员变量应该设置为有意义的东西。

标签: c mqtt paho


【解决方案1】:

我的函数 MQTTClient_create 返回错误(Lundin 是对的),因为我传递了需要 SSL 的连接字符串,而我当前的库不支持 SSL。所以,MQTTClient 没有创建,我试图访问它的字段 m->c->connect_state 并得到分段错误。

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多