使用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
相关产品推荐
相关产品推荐

