You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jansson解析管道JSON数据时出现Core Dump问题排查

核心错误及修复方案

1. 直接引发Core Dump的原因

你定义了静态指针static ConvertedData *converted_data = NULL;,但从未给它分配内存,后续代码直接通过converted_data->obj_ids[i]等方式解引用空指针,这会直接触发段错误(Core Dump)。

两种修复方式:

  • 方式一:使用栈上结构体
    把指针改为栈上的结构体变量,访问时用.代替->:

    static ConvertedData converted_data; // 直接定义栈上结构体,无需分配内存
    // 后续访问示例
    converted_data.obj_ids[i] = json_integer_value(json_array_get(obj_ids, i));
    
  • 方式二:动态分配内存
    在使用前为指针分配内存,记得程序结束前释放:

    converted_data = malloc(sizeof(ConvertedData));
    if (!converted_data) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    // 程序末尾释放
    free(converted_data);
    

2. 其他潜在问题(需一并修复)

  • MAX_ENTRIES未定义:结构体中用到的MAX_ENTRIES没有常量定义,编译会报错,需补充#define MAX_ENTRIES 10(数值根据实际需求调整)。
  • 管道读取未加字符串终止符:read不会自动在缓冲区末尾添加\0,但json_loads要求输入是C风格字符串,会导致解析失败或异常。修复代码:
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer)-1); // 预留一个字节给终止符
    if (bytesRead == -1) {
        perror("Error reading from named pipe");
        close(fd);
        exit(EXIT_FAILURE); // 原代码未退出,会继续执行错误逻辑
    }
    buffer[bytesRead] = '\0'; // 添加字符串终止符
    
  • 缺少syslog头文件:使用syslog需要包含<syslog.h>,否则编译会出现警告或错误。
  • 冗余的引用计数操作:json_object_get返回的是原对象的引用,无需手动调用json_incref,对应的json_decref也可以去掉,仅保留json_decref(obj);即可。
  • 错误处理不完整:原代码中read失败后未退出程序,会继续执行后续JSON解析逻辑,引发更多错误。

内容的提问来源于stack exchange,提问作者Nachiket Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:50