Skip to content

Commit cbb12e3

Browse files
committed
Updates to configuration flags used in error handling implementation.
The new configuration make Error history tracking switched off by default and enabled by using the config flag MBED_CONF_PLATFORM_ERROR_HIST_ENABLED. Config flag MBED_CONF_PLATFORM_ERROR_ALL_THREADS_INFO enables printing info of all threads. This will be turned off by default.
1 parent c4edf06 commit cbb12e3

File tree

6 files changed

+159
-110
lines changed

6 files changed

+159
-110
lines changed

TESTS/mbed_platform/error_handling/main.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,12 @@ void test_error_context_capture()
132132
TEST_ASSERT_EQUAL_UINT((uint32_t)current_thread->thread_addr, error_ctx.thread_entry_address);
133133
TEST_ASSERT_EQUAL_UINT((uint32_t)current_thread->stack_size, error_ctx.thread_stack_size);
134134
TEST_ASSERT_EQUAL_UINT((uint32_t)current_thread->stack_mem, error_ctx.thread_stack_mem);
135-
#ifdef MBED_CONF_ERROR_FILENAME_CAPTURE_ENABLED
135+
#if MBED_CONF_PLATFORM_ERROR_FILENAME_CAPTURE_ENABLED
136136
TEST_ASSERT_EQUAL_STRING(MBED_FILENAME, error_ctx.error_filename);
137137
#endif
138138
}
139139

140-
#ifndef MBED_CONF_ERROR_HIST_DISABLED
140+
#if MBED_CONF_PLATFORM_ERROR_HIST_ENABLED
141141
/** Test error logging functionality
142142
*/
143143
void test_error_logging()
@@ -351,7 +351,7 @@ Case cases[] = {
351351
Case("Test error context capture", test_error_context_capture),
352352
#endif //MBED_CONF_RTOS_PRESENT
353353
Case("Test error hook", test_error_hook),
354-
#ifndef MBED_CONF_ERROR_HIST_DISABLED
354+
#if MBED_CONF_PLATFORM_ERROR_HIST_ENABLED
355355
Case("Test error logging", test_error_logging),
356356
#if MBED_CONF_RTOS_PRESENT
357357
Case("Test error handling multi-threaded", test_error_logging_multithread),

platform/mbed_error.c

Lines changed: 109 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ static mbed_error_status_t handle_error(mbed_error_status_t error_status, unsign
132132

133133
#endif //MBED_CONF_RTOS_PRESENT
134134

135-
#ifdef MBED_CONF_ERROR_FILENAME_CAPTURE_ENABLED
135+
#ifdef MBED_CONF_PLATFORM_ERROR_FILENAME_CAPTURE_ENABLED
136136
//Capture filename/linenumber if provided
137137
//Index for tracking error_filename
138-
memset(&current_error_ctx.error_filename, 0, MBED_CONF_MAX_ERROR_FILENAME_LEN);
139-
strncpy(current_error_ctx.error_filename, filename, MBED_CONF_MAX_ERROR_FILENAME_LEN);
138+
memset(&current_error_ctx.error_filename, 0, MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN);
139+
strncpy(current_error_ctx.error_filename, filename, MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN);
140140
current_error_ctx.error_line_number = line_number;
141141
#endif
142142

@@ -148,7 +148,7 @@ static mbed_error_status_t handle_error(mbed_error_status_t error_status, unsign
148148
//copy this error to last error
149149
memcpy(&last_error_ctx, &current_error_ctx, sizeof(mbed_error_ctx));
150150

151-
#ifndef MBED_CONF_ERROR_HIST_DISABLED
151+
#if MBED_CONF_PLATFORM_ERROR_HIST_ENABLED
152152
//Log the error with error log
153153
mbed_error_hist_put(&current_error_ctx);
154154
#endif
@@ -190,7 +190,7 @@ mbed_error_status_t mbed_warning(mbed_error_status_t error_status, const char *e
190190
return handle_error(error_status, error_value, filename, line_number);
191191
}
192192

193-
//Sets a fatal error
193+
//Sets a fatal error, this function is marked WEAK to be able to override this for some tests
194194
WEAK mbed_error_status_t mbed_error(mbed_error_status_t error_status, const char *error_msg, unsigned int error_value, const char *filename, int line_number)
195195
{
196196
//set the error reported and then halt the system
@@ -273,15 +273,117 @@ mbed_error_status_t mbed_clear_all_errors(void)
273273
memset(&last_error_ctx, sizeof(mbed_error_ctx), 0);
274274
//reset error count to 0
275275
error_count = 0;
276-
#ifndef MBED_CONF_ERROR_HIST_DISABLED
276+
#if MBED_CONF_PLATFORM_ERROR_HIST_ENABLED
277277
status = mbed_error_hist_reset();
278278
#endif
279279
core_util_critical_section_exit();
280280

281281
return status;
282282
}
283283

284-
#ifndef MBED_CONF_ERROR_HIST_DISABLED
284+
#if MBED_CONF_PLATFORM_ERROR_ALL_THREADS_INFO && defined(MBED_CONF_RTOS_PRESENT)
285+
/* Prints info of a thread(using osRtxThread_t struct)*/
286+
static void print_thread(osRtxThread_t *thread)
287+
{
288+
mbed_error_printf("\nState: 0x%08X Entry: 0x%08X Stack Size: 0x%08X Mem: 0x%08X SP: 0x%08X", thread->state, thread->thread_addr, thread->stack_size, (uint32_t)thread->stack_mem, thread->sp);
289+
}
290+
291+
/* Prints thread info from a list */
292+
static void print_threads_info(osRtxThread_t *threads)
293+
{
294+
while(threads != NULL) {
295+
print_thread( threads );
296+
threads = threads->thread_next;
297+
}
298+
}
299+
#endif
300+
301+
static void print_error_report(mbed_error_ctx *ctx, const char *error_msg)
302+
{
303+
uint32_t error_code = MBED_GET_ERROR_CODE(ctx->error_status);
304+
uint32_t error_module = MBED_GET_ERROR_MODULE(ctx->error_status);
305+
306+
mbed_error_printf("\n\n++ MbedOS Error Info ++\nError Status: 0x%X Code: %d Module: %d\nError Message: ", ctx->error_status, error_code, error_module);
307+
308+
switch (error_code) {
309+
//These are errors reported by kernel handled from mbed_rtx_handlers
310+
case MBED_ERROR_CODE_RTOS_EVENT:
311+
mbed_error_printf("Kernel Error: 0x%X, ", ctx->error_value);
312+
break;
313+
314+
case MBED_ERROR_CODE_RTOS_THREAD_EVENT:
315+
mbed_error_printf("Thread: 0x%X, ", ctx->error_value);
316+
break;
317+
318+
case MBED_ERROR_CODE_RTOS_MUTEX_EVENT:
319+
mbed_error_printf("Mutex: 0x%X, ", ctx->error_value);
320+
break;
321+
322+
case MBED_ERROR_CODE_RTOS_SEMAPHORE_EVENT:
323+
mbed_error_printf("Semaphore: 0x%X, ", ctx->error_value);
324+
break;
325+
326+
case MBED_ERROR_CODE_RTOS_MEMORY_POOL_EVENT:
327+
mbed_error_printf("MemoryPool: 0x%X, ", ctx->error_value);
328+
break;
329+
330+
case MBED_ERROR_CODE_RTOS_EVENT_FLAGS_EVENT:
331+
mbed_error_printf("EventFlags: 0x%X, ", ctx->error_value);
332+
break;
333+
334+
case MBED_ERROR_CODE_RTOS_TIMER_EVENT:
335+
mbed_error_printf("Timer: 0x%X, ", ctx->error_value);
336+
break;
337+
338+
case MBED_ERROR_CODE_RTOS_MESSAGE_QUEUE_EVENT:
339+
mbed_error_printf("MessageQueue: 0x%X, ", ctx->error_value);
340+
break;
341+
342+
default:
343+
//Nothing to do here, just print the error info down
344+
break;
345+
}
346+
mbed_error_printf(error_msg);
347+
mbed_error_printf("\nLocation: 0x%X", ctx->error_address);
348+
349+
#if MBED_CONF_PLATFORM_ERROR_FILENAME_CAPTURE_ENABLED && !defined(NDEBUG)
350+
if((NULL != ctx->error_filename[0]) && (ctx->error_line_number != 0)) {
351+
//for string, we must pass address of a ptr which has the address of the string
352+
mbed_error_printf("\nFile:%s+%d", ctx->error_filename, ctx->error_line_number);
353+
}
354+
#endif
355+
356+
mbed_error_printf("\nError Value: 0x%X", ctx->error_value);
357+
#ifdef TARGET_CORTEX_M
358+
mbed_error_printf("\nCurrent Thread: Id: 0x%X Entry: 0x%X StackSize: 0x%X StackMem: 0x%X SP: 0x%X ",
359+
ctx->thread_id, ctx->thread_entry_address, ctx->thread_stack_size, ctx->thread_stack_mem, ctx->thread_current_sp);
360+
#else
361+
//For Cortex-A targets we dont have support to capture the current SP
362+
mbed_error_printf("\nCurrent Thread: Id: 0x%X Entry: 0x%X StackSize: 0x%X StackMem: 0x%X ",
363+
ctx->thread_id, ctx->thread_entry_address, ctx->thread_stack_size, ctx->thread_stack_mem);
364+
#endif //TARGET_CORTEX_M
365+
366+
#if MBED_CONF_PLATFORM_ERROR_ALL_THREADS_INFO && defined(MBED_CONF_RTOS_PRESENT)
367+
mbed_error_printf("\nNext:");
368+
print_thread(osRtxInfo.thread.run.next);
369+
370+
mbed_error_printf("\nWait:");
371+
osRtxThread_t *threads = (osRtxThread_t *)&osRtxInfo.thread.wait_list;
372+
print_threads_info(threads);
373+
374+
mbed_error_printf("\nDelay:");
375+
threads = (osRtxThread_t *)&osRtxInfo.thread.delay_list;
376+
print_threads_info(threads);
377+
378+
mbed_error_printf("\nIdle:");
379+
threads = (osRtxThread_t *)&osRtxInfo.thread.idle;
380+
print_threads_info(threads);
381+
#endif
382+
383+
mbed_error_printf("\n-- MbedOS Error Info --\n");
384+
}
385+
386+
#if MBED_CONF_PLATFORM_ERROR_HIST_ENABLED
285387
//Retrieve the error context from error log at the specified index
286388
mbed_error_status_t mbed_get_error_hist_info (int index, mbed_error_ctx *error_info)
287389
{
@@ -352,83 +454,5 @@ mbed_error_status_t mbed_save_error_hist(const char *path)
352454

353455
return ret;
354456
}
355-
356-
static void print_error_report(mbed_error_ctx *ctx, const char *error_msg)
357-
{
358-
uint32_t error_code = MBED_GET_ERROR_CODE(ctx->error_status);
359-
uint32_t error_module = MBED_GET_ERROR_MODULE(ctx->error_status);
360-
361-
mbed_error_printf("\n\n++ MbedOS Error Info ++\nError Status: 0x%x Code: %d Module: %d\nError Message: ", ctx->error_status, error_code, error_module);
362-
363-
//Report error info based on error code, some errors require different
364-
//error_vals[1] contains the error code
365-
if(error_code == MBED_ERROR_CODE_HARDFAULT_EXCEPTION ||
366-
error_code == MBED_ERROR_CODE_MEMMANAGE_EXCEPTION ||
367-
error_code == MBED_ERROR_CODE_BUSFAULT_EXCEPTION ||
368-
error_code == MBED_ERROR_CODE_USAGEFAULT_EXCEPTION ) {
369-
mbed_error_printf(error_msg);
370-
mbed_error_printf("\nLocation: 0x%x\n", ctx->error_value);
371-
} else {
372-
switch (error_code) {
373-
//These are errors reported by kernel handled from mbed_rtx_handlers
374-
case MBED_ERROR_CODE_RTOS_EVENT:
375-
mbed_error_printf("Kernel Error: 0x%x, ", ctx->error_value);
376-
break;
377-
378-
case MBED_ERROR_CODE_RTOS_THREAD_EVENT:
379-
mbed_error_printf("Thread: 0x%x, ", ctx->error_value);
380-
break;
381-
382-
case MBED_ERROR_CODE_RTOS_MUTEX_EVENT:
383-
mbed_error_printf("Mutex: 0x%x, ", ctx->error_value);
384-
break;
385-
386-
case MBED_ERROR_CODE_RTOS_SEMAPHORE_EVENT:
387-
mbed_error_printf("Semaphore: 0x%x, ", ctx->error_value);
388-
break;
389-
390-
case MBED_ERROR_CODE_RTOS_MEMORY_POOL_EVENT:
391-
mbed_error_printf("MemoryPool: 0x%x, ", ctx->error_value);
392-
break;
393-
394-
case MBED_ERROR_CODE_RTOS_EVENT_FLAGS_EVENT:
395-
mbed_error_printf("EventFlags: 0x%x, ", ctx->error_value);
396-
break;
397-
398-
case MBED_ERROR_CODE_RTOS_TIMER_EVENT:
399-
mbed_error_printf("Timer: 0x%x, ", ctx->error_value);
400-
break;
401-
402-
case MBED_ERROR_CODE_RTOS_MESSAGE_QUEUE_EVENT:
403-
mbed_error_printf("MessageQueue: 0x%x, ", ctx->error_value);
404-
break;
405-
406-
default:
407-
//Nothing to do here, just print the error info down
408-
break;
409-
}
410-
mbed_error_printf(error_msg, NULL);
411-
mbed_error_printf("\nLocation: 0x%x", ctx->error_address);
412-
#if defined(MBED_CONF_ERROR_FILENAME_CAPTURE_ENABLED) && !defined(NDEBUG)
413-
if(NULL != ctx->error_filename) {
414-
//for string, we must pass address of a ptr which has the address of the string
415-
mbed_error_printf("\nFile:%s+%d", ctx->error_filename, ctx->error_line_number);
416-
}
417-
#endif
418-
419-
#ifdef TARGET_CORTEX_M
420-
mbed_error_printf("\nError Value: 0x%x\nCurrent Thread: Id: 0x%x Entry: 0x%x StackSize: 0x%x StackMem: 0x%x SP: 0x%x ",
421-
ctx->error_value, ctx->thread_id, ctx->thread_entry_address, ctx->thread_stack_size, ctx->thread_stack_mem, ctx->thread_current_sp);
422-
#else
423-
//For Cortex-A targets we dont have support to capture the current SP
424-
mbed_error_printf("\nError Value: 0x%x\nCurrent Thread: Id: 0x%x Entry: 0x%x StackSize: 0x%x StackMem: 0x%x ",
425-
ctx->error_value, ctx->thread_id, ctx->thread_entry_address, ctx->thread_stack_size, ctx->thread_stack_mem);
426-
#endif //TARGET_CORTEX_M
427-
}
428-
429-
mbed_error_printf("\n-- MbedOS Error Info --\n");
430-
}
431-
432-
433457
#endif
434458

platform/mbed_error.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ extern "C" {
3030
#endif
3131

3232
/** Define this macro to include filenames in error context. For release builds, do not include filename to save memory.
33-
* MBED_CONF_ERROR_FILENAME_CAPTURE_ENABLED
33+
* MBED_PLATFORM_CONF_ERROR_FILENAME_CAPTURE_ENABLED
3434
*/
3535

3636
/** Define this macro to disable error logging, note that the first and last error capture will still be active by default.
37-
* MBED_CONF_ERROR_HIST_DISABLED
37+
* MBED_PLATFORM_CONF_ERROR_HIST_DISABLED
3838
*/
3939

40-
#ifndef MBED_CONF_MAX_ERROR_FILENAME_LEN
41-
#define MBED_CONF_MAX_ERROR_FILENAME_LEN 16
40+
#ifndef MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN
41+
#define MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN 16
4242
#endif
4343

4444
#define MBED_ERROR_STATUS_CODE_MASK (0x0000FFFF)
@@ -147,7 +147,7 @@ typedef int mbed_error_status_t;
147147
#define MBED_WARNING1( error_status, error_msg, error_value ) mbed_warning( error_status, (const char *)NULL, (uint32_t)error_value, NULL, 0 )
148148
#define MBED_WARNING( error_status, error_msg ) mbed_warning( error_status, (const char *)NULL, (uint32_t)0, NULL, 0 )
149149
#else
150-
#if defined(MBED_CONF_ERROR_FILENAME_CAPTURE_ENABLED)
150+
#if MBED_CONF_PLATFORM_ERROR_FILENAME_CAPTURE_ENABLED
151151
#define MBED_WARNING1( error_status, error_msg, error_value ) mbed_warning( error_status, (const char *)error_msg, (uint32_t)error_value, (const char *)MBED_FILENAME, __LINE__ )
152152
#define MBED_WARNING( error_status, error_msg ) mbed_warning( error_status, (const char *)error_msg, (uint32_t)0 , (const char *)MBED_FILENAME, __LINE__ )
153153
#else
@@ -179,7 +179,7 @@ typedef int mbed_error_status_t;
179179
#define MBED_ERROR1( error_status, error_msg, error_value ) mbed_error( error_status, (const char *)NULL, (uint32_t)error_value, NULL, 0 )
180180
#define MBED_ERROR( error_status, error_msg ) mbed_error( error_status, (const char *)NULL, (uint32_t)0 , NULL, 0 )
181181
#else
182-
#if defined(MBED_CONF_ERROR_FILENAME_CAPTURE_ENABLED)
182+
#if MBED_CONF_PLATFORM_ERROR_FILENAME_CAPTURE_ENABLED
183183
#define MBED_ERROR1( error_status, error_msg, error_value ) mbed_error( error_status, (const char *)error_msg, (uint32_t)error_value, (const char *)MBED_FILENAME, __LINE__ )
184184
#define MBED_ERROR( error_status, error_msg ) mbed_error( error_status, (const char *)error_msg, (uint32_t)0 , (const char *)MBED_FILENAME, __LINE__ )
185185
#else
@@ -812,8 +812,8 @@ typedef struct _mbed_error_ctx {
812812
uint32_t thread_stack_size;
813813
uint32_t thread_stack_mem;
814814
uint32_t thread_current_sp;
815-
#ifdef MBED_CONF_ERROR_FILENAME_CAPTURE_ENABLED
816-
char error_filename[MBED_CONF_MAX_ERROR_FILENAME_LEN];
815+
#ifdef MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN
816+
char error_filename[MBED_CONF_PLATFORM_MAX_ERROR_FILENAME_LEN];
817817
uint32_t error_line_number;
818818
#endif
819819
} mbed_error_ctx;

platform/mbed_error_hist.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
#include "platform/mbed_critical.h"
2222
#include "platform/mbed_interface.h"
2323

24-
#ifndef MBED_CONF_ERROR_HIST_DISABLED
24+
#if MBED_CONF_PLATFORM_ERROR_HIST_ENABLED
2525
#include "platform/mbed_error_hist.h"
2626

27-
static mbed_error_ctx mbed_error_ctx_log[MBED_CONF_ERROR_HIST_SIZE] = {0};
27+
static mbed_error_ctx mbed_error_ctx_log[MBED_CONF_PLATFORM_ERROR_HIST_SIZE] = {0};
2828
static int error_log_count = -1;
2929

3030
mbed_error_status_t mbed_error_hist_put(mbed_error_ctx *error_ctx)
@@ -36,7 +36,7 @@ mbed_error_status_t mbed_error_hist_put(mbed_error_ctx *error_ctx)
3636

3737
core_util_critical_section_enter();
3838
error_log_count++;
39-
memcpy(&mbed_error_ctx_log[error_log_count % MBED_CONF_ERROR_HIST_SIZE], error_ctx, sizeof(mbed_error_ctx) );
39+
memcpy(&mbed_error_ctx_log[error_log_count % MBED_CONF_PLATFORM_ERROR_HIST_SIZE], error_ctx, sizeof(mbed_error_ctx) );
4040
core_util_critical_section_exit();
4141

4242
return MBED_SUCCESS;
@@ -45,17 +45,17 @@ mbed_error_status_t mbed_error_hist_put(mbed_error_ctx *error_ctx)
4545
mbed_error_status_t mbed_error_hist_get(int index, mbed_error_ctx *error_ctx)
4646
{
4747
//Return error if index is more than max log size
48-
if(index >= MBED_CONF_ERROR_HIST_SIZE) {
48+
if(index >= MBED_CONF_PLATFORM_ERROR_HIST_SIZE) {
4949
return MBED_ERROR_INVALID_ARGUMENT;
5050
}
5151

5252
core_util_critical_section_enter();
5353
//calculate the index where we want to pick the ctx
54-
if(error_log_count >= MBED_CONF_ERROR_HIST_SIZE) {
55-
index = (error_log_count + index + 1) % MBED_CONF_ERROR_HIST_SIZE;
54+
if(error_log_count >= MBED_CONF_PLATFORM_ERROR_HIST_SIZE) {
55+
index = (error_log_count + index + 1) % MBED_CONF_PLATFORM_ERROR_HIST_SIZE;
5656
}
5757
core_util_critical_section_exit();
58-
memcpy(error_ctx, &mbed_error_ctx_log[index % MBED_CONF_ERROR_HIST_SIZE], sizeof(mbed_error_ctx) );
58+
memcpy(error_ctx, &mbed_error_ctx_log[index % MBED_CONF_PLATFORM_ERROR_HIST_SIZE], sizeof(mbed_error_ctx) );
5959

6060
return MBED_SUCCESS;
6161
}
@@ -64,7 +64,7 @@ mbed_error_ctx *mbed_error_hist_get_entry(void)
6464
{
6565
core_util_critical_section_enter();
6666
error_log_count++;
67-
mbed_error_ctx *ctx = &mbed_error_ctx_log[error_log_count % MBED_CONF_ERROR_HIST_SIZE];
67+
mbed_error_ctx *ctx = &mbed_error_ctx_log[error_log_count % MBED_CONF_PLATFORM_ERROR_HIST_SIZE];
6868
core_util_critical_section_exit();
6969

7070
return ctx;
@@ -76,15 +76,15 @@ mbed_error_status_t mbed_error_hist_get_last_error(mbed_error_ctx *error_ctx)
7676
return MBED_ERROR_ITEM_NOT_FOUND;
7777
}
7878
core_util_critical_section_enter();
79-
memcpy(error_ctx, &mbed_error_ctx_log[error_log_count % MBED_CONF_ERROR_HIST_SIZE], sizeof(mbed_error_ctx) );
79+
memcpy(error_ctx, &mbed_error_ctx_log[error_log_count % MBED_CONF_PLATFORM_ERROR_HIST_SIZE], sizeof(mbed_error_ctx) );
8080
core_util_critical_section_exit();
8181

8282
return MBED_SUCCESS;
8383
}
8484

8585
int mbed_error_hist_get_count()
8686
{
87-
return (error_log_count >= MBED_CONF_ERROR_HIST_SIZE? MBED_CONF_ERROR_HIST_SIZE:error_log_count+1);
87+
return (error_log_count >= MBED_CONF_PLATFORM_ERROR_HIST_SIZE? MBED_CONF_PLATFORM_ERROR_HIST_SIZE:error_log_count+1);
8888
}
8989

9090
mbed_error_status_t mbed_error_hist_reset()

platform/mbed_error_hist.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
#ifndef MBED_ERROR_HIST_H
1717
#define MBED_ERROR_HIST_H
1818

19-
#ifndef MBED_CONF_ERROR_HIST_SIZE
20-
#define MBED_CONF_ERROR_HIST_SIZE 4
19+
#ifndef MBED_CONF_PLATFORM_ERROR_HIST_SIZE
20+
#define MBED_CONF_PLATFORM_ERROR_HIST_SIZE 4
2121
#else
22-
#if MBED_CONF_ERROR_HIST_SIZE == 0
23-
#define MBED_CONF_ERROR_HIST_SIZE 1
22+
#if MBED_CONF_PLATFORM_ERROR_HIST_SIZE == 0
23+
#define MBED_CONF_PLATFORM_ERROR_HIST_SIZE 1
2424
#endif
2525
#endif
2626

0 commit comments

Comments
 (0)