【问题标题】:Which variable cause segmentation fault?哪个变量导致分段错误?
【发布时间】: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


【解决方案1】:

如何知道是哪个变量引发了问题?

替换

if (m == NULL || ma == NULL || m->c->connect_state != NOT_IN_PROGRESS)
    rc = MQTTCLIENT_FAILURE;

暂时与

if (m == NULL)
    rc = MQTTCLIENT_FAILURE;

else if (ma == NULL)
    rc = MQTTCLIENT_FAILURE;

else if (m->c->connect_state != NOT_IN_PROGRESS)
    rc = MQTTCLIENT_FAILURE;

现在您可以看到是哪个变量导致了问题。

【讨论】:

猜你喜欢
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2020-12-31
  • 2019-07-21
相关资源
最近更新 更多