【发布时间】:2022-01-03 04:23:37
【问题描述】:
尝试调试 MQTT Paho 库中未处理的异常。无法弄清楚哪个确切的变量会引起分段错误。变量 m 和 ma 不为 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)
rc = MQTTCLIENT_FAILURE;
else
{
m->context = context;
m->cl = cl;
m->ma = ma;
m->dc = dc;
}
Thread_unlock_mutex(mqttclient_mutex);
FUNC_EXIT_RC(rc);
return rc;
}
此代码来自官方 Paho 库: https://github.com/eclipse/paho.mqtt.c/blob/master/src/MQTTClient.c 以及为什么他们做出这样的任务: MQTTClients* m = 句柄;
【问题讨论】:
-
很可能
m->c为空或无效,或者m不为空但指向的位置无效(悬空、未初始化等) -
给定一些
MQTTClient handle,那么MQTTClients* m = handle;是无效的C。除非MQTTClients(带s)是某种奇异的类型。如果这不是拼写错误,那么这些类型名称非常糟糕。 -
也许调试器显示
{...},因为它不知道由于错误而导致的值。 -
这个宏废话在做什么
FUNC_ENTRY;?摆脱神奇的神秘宏,让C程序员可以阅读和调试代码…… -
请不要发布代码图片,发布实际文本并正确格式化。图片真的很难阅读,无法搜索或使用屏幕阅读器的人。
标签: c visual-c++ mqtt paho