cJSON_PrintUnformatted err = -ENOMEM;

Hi,

I am using CJSON_LIB from nrf-sdk modules, I even tested this cjson lib in such a simple way in helloworld app (I attached the sample project.), and after running for a while, I have a no memory space issue, Any idea? I was expecting to free up the memory by running cJSON_Delete(root_obj); these cjson libs are used in the asset tracker application.  So it means this issue is valid for atv2 app as well?, Could you please verify?

 

{"status":{"echo":"error_report->cmd_echo","cmd":"cmd2str(error_report->cmd)","sub_cmd":"dev_sub_cmd2str(error_report->sub_cmd.dev_sub_cmd)","step":"common_steps2str(error_report->step[error_report->dev_type])","result":"dev_result2str(error_report->result)"},"data":{"ret":"error_report->data.data_str","type":"type2str(error_report->type)"}}
2143
40 main.c
53 main.c
61 main.c
75 main.c
77 main.c
91 main.c
92 main.c
94 main.c
105 main.c
{"status":{"echo":"error_report->cmd_echo","cmd":"cmd2str(error_report->cmd)","sub_cmd":"dev_sub_cmd2str(error_report->sub_cmd.dev_sub_cmd)","step":"common_steps2str(error_report->step[error_report->dev_type])","result":"dev_result2str(error_report->result)"},"data":{"ret":"error_report->data.data_str","type":"type2str(error_report->type)"}}
2144
40 main.c
53 main.c
61 main.c
75 main.c
77 main.c
91 main.c
92 main.c
94 main.c
105 main.c
{"status":{"echo":"error_report->cmd_echo","cmd":"cmd2str(error_report->cmd)","sub_cmd":"dev_sub_cmd2str(error_report->sub_cmd.dev_sub_cmd)","step":"common_steps2str(error_report->step[error_report->dev_type])","result":"dev_result2str(error_report->result)"},"data":{"ret":"error_report->data.data_str","type":"type2str(error_report->type)"}}
2145
40 main.c
53 main.c
61 main.c
75 main.c
77 main.c
91 main.c
92 main.c
94 main.c
105 main.c
{"status":{"echo":"error_report->cmd_echo","cmd":"cmd2str(error_report->cmd)","sub_cmd":"dev_sub_cmd2str(error_report->sub_cmd.dev_sub_cmd)","step":"common_steps2str(error_report->step[error_report->dev_type])","result":"dev_result2str(error_report->result)"},"data":{"ret":"error_report->data.data_str","type":"type2str(error_report->type)"}}
2146
40 main.c
53 main.c
61 main.c
75 main.c
77 main.c
91 main.c
92 main.c
94 main.c
105 main.c
{"status":{"echo":"error_report->cmd_echo","cmd":"cmd2str(error_report->cmd)","sub_cmd":"dev_sub_cmd2str(error_report->sub_cmd.dev_sub_cmd)","step":"common_steps2str(error_report->step[error_report->dev_type])","result":"dev_result2str(error_report->result)"},"data":{"ret":"error_report->data.data_str","type":"type2str(error_report->type)"}}
2147
40 main.c
53 main.c
61 main.c
75 main.c
77 main.c
91 main.c
92 main.c
94 main.c
97 main.c
105 main.c
[00:03:45.874,000] <err> os: ***** BUS FAULT *****
[00:03:45.874,000] <err> os:   Precise data bus error
[00:03:45.874,000] <err> os:   BFAR Address: 0x0
[00:03:45.874,000] <err> os: r0/a1:  0x00000000  r1/a2:  0x0800bf3a  r2/a3:  0x00000000
[00:03:45.874,000] <err> os: r3/a4:  0x00000000 r12/ip:  0x00007252 r14/lr:  0x08001f35
[00:03:45.874,000] <err> os:  xpsr:  0x61000000
[00:03:45.874,000] <err> os: Faulting instruction address (r15/pc): 0x08000e32
[00:03:45.874,000] <err> os: >>> ZEPHYR FATAL ERROR 25: Unknown error on CPU 0
[00:03:45.874,000] <err> os: Current thread: 0x20002e20 (unknown)
[00:03:46.016,000] <err> fatal_error: Resetting system*** Booting nRF Connect SDK v3.6.0 ***

in the test app: I am printing encoded json data with a 100ms delay (just to see error quickly), after printing 2147 times, memory issue happpend

here is the code: 

#define FILE_NAME "main.c"
struct usb_codec_data {
	/** Encoded output. */
	char *buf;
	/** Length of encoded output. */
	size_t len;
};
static void encode_json(struct usb_codec_data * usb_log)
{
	int err = 0;
	__ASSERT_NO_MSG(error_report != NULL);

	cJSON *root_obj = cJSON_CreateObject();
	cJSON *sub_obj = cJSON_CreateObject();
	cJSON *data_obj = cJSON_CreateObject();

	if (root_obj == NULL || sub_obj == NULL|| data_obj == NULL) {
		printk("%d %s\n", __LINE__, FILE_NAME);
		err = -ENOMEM;
		goto exit;
	}
	printk("%d %s\n", __LINE__, FILE_NAME);
	err = json_add_str(sub_obj, CMD_ECHO, "error_report->cmd_echo");
	if (err)
	{
		printk("Encoding error: %d returned at %s:%d\n", err, __FILE__, __LINE__);
		goto exit;
	}
	err = json_add_str(sub_obj, CMD_FOR, "cmd2str(error_report->cmd)");
	if (err)
	{
		printk("Encoding error: %d returned at %s:%d\n", err, __FILE__, __LINE__);
		goto exit;
	}
	printk("%d %s\n", __LINE__, FILE_NAME);
	
	err = json_add_str(sub_obj, CMD_SUB_FOR, "dev_sub_cmd2str(error_report->sub_cmd.dev_sub_cmd)");
	if (err)
	{
		printk("Encoding error: %d returned at %s:%d\n", err, __FILE__, __LINE__);
		goto exit;
	}
	printk("%d %s\n", __LINE__, FILE_NAME);
	err = json_add_str(sub_obj, CMD_STEP, "common_steps2str(error_report->step[error_report->dev_type])");
	if (err)
	{
		printk("Encoding error: %d returned at %s:%d\n", err, __FILE__, __LINE__);
		goto exit;
	}
	
	err = json_add_str(sub_obj, CMD_RESULT, "dev_result2str(error_report->result)");
	if (err)
	{
		printk("Encoding error: %d returned at %s:%d\n", err, __FILE__, __LINE__);
		goto exit;
	}
	printk("%d %s\n", __LINE__, FILE_NAME);
    json_add_obj(root_obj, OBJECT_STATUS, sub_obj);
	printk("%d %s\n", __LINE__, FILE_NAME);
		
	err = json_add_str(data_obj, CMD_RETURN_OBJ, "error_report->data.data_str");
	if (err)
	{
		printk("Encoding error: %d returned at %s:%d\n", err, __FILE__, __LINE__);
		goto exit;
	}
	err = json_add_str(data_obj, CMD_RETURN_TYPE, "type2str(error_report->type)");
	if (err)
	{
		printk("Encoding error: %d returned at %s:%d\n", err, __FILE__, __LINE__);
		goto exit;
	}
	printk("%d %s\n", __LINE__, FILE_NAME);
	printk("%d %s\n", __LINE__, FILE_NAME);
	json_add_obj(root_obj, OBJECT_DATA, data_obj);
	printk("%d %s\n", __LINE__, FILE_NAME);
	char *buffer = cJSON_PrintUnformatted(root_obj);
	if (buffer == NULL) {
		printk("%d %s\n", __LINE__, FILE_NAME);
		err = -ENOMEM;
		goto exit;
	}
	usb_log->buf = buffer;
	usb_log->len = strlen(buffer);
	exit:
		cJSON_Delete(root_obj);
		printk("%d %s\n", __LINE__, FILE_NAME);

	return;
}


int main(void)
{
	int i = 0;
	k_msleep(10000);
	while(1)
	{
		struct usb_codec_data usb_log = {0};
		encode_json(&usb_log);
		printk("%s\n",usb_log.buf);
		printk("%d\n", i++);
		k_msleep(100);
		encode_json(&usb_log);
		printk("%s\n",usb_log.buf);
		printk("%d\n", i++);
		k_msleep(100);
		// printf("Hello World! %s\n", CONFIG_BOARD);
		// encode_json_log();
	}
}

Parents Reply Children
No Data
Related