1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #20627 from benpicco/assert-zombi

core/assert: halt running thread instead of panic
This commit is contained in:
benpicco 2024-04-29 09:16:46 +00:00 committed by GitHub
commit 6c154958a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 27 additions and 9 deletions

View File

@ -19,34 +19,42 @@
#include "architecture.h" #include "architecture.h"
#include "cpu.h" #include "cpu.h"
#include "debug.h" #include "debug.h"
#include "irq.h"
#include "panic.h" #include "panic.h"
#if IS_USED(MODULE_BACKTRACE) #if IS_USED(MODULE_BACKTRACE)
#include "backtrace.h" #include "backtrace.h"
#endif #endif
__NORETURN void _assert_failure(const char *file, unsigned line) __NORETURN static inline void _assert_common(void)
{ {
printf("%s:%u => ", file, line);
#if IS_USED(MODULE_BACKTRACE) #if IS_USED(MODULE_BACKTRACE)
#ifdef DEBUG_ASSERT_VERBOSE
printf("failed assertion. Backtrace:\n"); printf("failed assertion. Backtrace:\n");
#endif
backtrace_print(); backtrace_print();
#endif #endif
#ifdef DEBUG_ASSERT_BREAKPOINT #ifdef DEBUG_ASSERT_BREAKPOINT
DEBUG_BREAKPOINT(1); DEBUG_BREAKPOINT(1);
#endif #endif
if (DEBUG_ASSERT_NO_PANIC && !irq_is_in() && irq_is_enabled()) {
puts("FAILED ASSERTION.");
while (1) {
thread_sleep();
}
}
core_panic(PANIC_ASSERT_FAIL, "FAILED ASSERTION."); core_panic(PANIC_ASSERT_FAIL, "FAILED ASSERTION.");
} }
__NORETURN void _assert_failure(const char *file, unsigned line)
{
printf("%s:%u => ", file, line);
_assert_common();
}
__NORETURN void _assert_panic(void) __NORETURN void _assert_panic(void)
{ {
printf("%" PRIxTXTPTR "\n", cpu_get_caller_pc()); printf("%" PRIxTXTPTR "\n", cpu_get_caller_pc());
#if IS_USED(MODULE_BACKTRACE) _assert_common();
backtrace_print();
#endif
#ifdef DEBUG_ASSERT_BREAKPOINT
DEBUG_BREAKPOINT(1);
#endif
core_panic(PANIC_ASSERT_FAIL, "FAILED ASSERTION.");
} }
/** @} */ /** @} */

View File

@ -157,6 +157,15 @@ __NORETURN void _assert_panic(void);
#endif #endif
#endif #endif
/**
* @brief Don't panic on a failed assertion, just halt the running thread.
*
* If the assertion failed in an interrupt, the system will still panic.
*/
#ifndef DEBUG_ASSERT_NO_PANIC
#define DEBUG_ASSERT_NO_PANIC (1)
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -35,6 +35,7 @@ BOARD_INSUFFICIENT_MEMORY := \
nucleo-l031k6 \ nucleo-l031k6 \
nucleo-l053r8 \ nucleo-l053r8 \
nucleo-l412kb \ nucleo-l412kb \
maple-mini \
olimexino-stm32 \ olimexino-stm32 \
opencm904 \ opencm904 \
samd10-xmini \ samd10-xmini \