# Debug configuration options # Copyright (c) 2015 Wind River Systems, Inc. # SPDX-License-Identifier: Apache-2.0 menu "System Monitoring Options" source "subsys/debug/thread_analyzer/Kconfig" endmenu menu "Debugging Options" config DEBUG bool "Build kernel with debugging enabled" help Build a kernel suitable for debugging. Right now, this option only disables optimization, more debugging variants can be selected from here to allow more debugging. config GPROF bool "Generate profiling information" depends on ARCH_POSIX help Generate call graph profile data for the application that can be analyzed with gprof config ASAN bool "Build with address sanitizer" depends on ARCH_POSIX help Builds Zephyr with Address Sanitizer enabled. This is currently only supported by boards based on the posix architecture, and requires a recent-ish compiler with the ``-fsanitize=address`` command line option, and the libasan library. Note that at exit leak detection is disabled for 64-bit boards when GCC is used due to potential risk of a deadlock in libasan. This behavior can be changes by adding leak_check_at_exit=1 to the environment variable ASAN_OPTIONS. config ASAN_RECOVER bool "Continue after sanitizer errors" depends on ASAN default y help The default behavior of compiler sanitizers is to exit after the first error. Set this to y to enable the code to continue, which can be useful if a code base has known unsuppressed errors. You will also need to set "halt_on_error=0" in your ASAN_OPTIONS environment variable at runtime. config ASAN_NOP_DLCLOSE bool "Override host OS dlclose() with a NOP" default y if HAS_SDL depends on ASAN help Override host OS dlclose() with a NOP. This NOP implementation is needed as workaround for a known limitation in LSAN (leak sanitizer) that if dlcose is called before performing the leak check, "" is reported in the stack traces during the leak check and these can not be suppressed, see https://github.com/google/sanitizers/issues/89 for more info. config UBSAN bool "Build with undefined behavior sanitizer" help Builds Zephyr with Undefined Behavior Sanitizer enabled. This requires a recent-ish compiler with the ``-fsanitize=undefined`` command line option. choice UBSAN_MODE prompt "Undefined behavior sanitizer mode" depends on UBSAN default UBSAN_LIBRARY config UBSAN_LIBRARY bool "Call ubsan routines" depends on ARCH_POSIX || PICOLIBC help Call ubsan library routines when undefined behavior is detected at runtime. This provides information about the faulting condition along with the source filename, line number, types and values involved. This is currently only supported by boards based on the posix architecture or when building with picolibc. config UBSAN_TRAP bool "Call __builtin_trap" help When undefined behavior is detected, invoke __builtin_trap to cause an exception to be raised. This can be used on any target, but the lack of information makes figuring out the triggering code difficult. endchoice config MSAN bool "Build with memory sanitizer" depends on ARCH_POSIX help Builds Zephyr with the LLVM MemorySanitizer enabled. Works only on the posix architecture currently, and only with host compilers recent enough to support the feature (currently clang on x86_64 only). It cannot be used in tandem with CONFIG_ASAN due to clang limitations. You must choose one or the other (but can combine it with CONFIG_UBSAN if you like) config STACK_USAGE bool "Generate stack usage information" help Generate an extra file that specifies the maximum amount of stack used, on a per-function basis. config STACK_SENTINEL bool "Stack sentinel" select THREAD_STACK_INFO depends on MULTITHREADING depends on !USERSPACE depends on !MPU_STACK_GUARD help Store a magic value at the lowest addresses of a thread's stack. Periodically check that this value is still present and kill the thread gracefully if it isn't. This is currently checked in four places: 1) Upon any context switch for the outgoing thread 2) Any hardware interrupt that doesn't context switch, the check is performed for the interrupted thread 3) When a thread returns from its entry point 4) When a thread calls k_yield() but doesn't context switch This feature doesn't prevent corruption and the system may be in an unusable state. However, given the bizarre behavior associated with stack overflows, knowledge that this is happening is very useful. This feature is intended for those systems which lack hardware support for stack overflow protection, or have insufficient system resources to use that hardware support. config PRINTK bool "Send printk() to console" default y help This option directs printk() debugging output to the supported console device, rather than suppressing the generation of printk() output entirely. Output is sent immediately, without any mutual exclusion or buffering. config PRINTK_BUFFER_SIZE int "printk() buffer size" depends on PRINTK depends on USERSPACE default 32 help If userspace is enabled, printk() calls are buffered so that we do not have to make a system call for every character emitted. Specify the size of this buffer. config EARLY_CONSOLE bool "Send stdout at the earliest stage possible" help This option will enable stdout as early as possible, for debugging purpose. For instance, in case of STDOUT_CONSOLE being set it will initialize its driver earlier than normal, in order to get the stdout sent through the console at the earliest stage possible. config ASSERT bool "__ASSERT() macro" default y if TEST help This enables the __ASSERT() macro in the kernel code. If an assertion fails, the policy for what to do is controlled by the implementation of the assert_post_action() function, which by default will trigger a fatal error. Disabling this option will cause assertions to compile to nothing, improving performance and system footprint. if ASSERT config ASSERT_LEVEL int "__ASSERT() level" default 2 range 0 2 help This option specifies the assertion level used by the __ASSERT() macro. It can be set to one of three possible values: Level 0: off Level 1: on + warning in every file that includes __assert.h Level 2: on + no warning config SPIN_VALIDATE bool "Spinlock validation" depends on MULTITHREADING depends on MP_MAX_NUM_CPUS <= 4 default y if !FLASH || FLASH_SIZE > 32 help There's a spinlock validation framework available when asserts are enabled. It adds a relatively hefty overhead (about 3k or so) to kernel code size, don't use on platforms known to be small. config SPIN_LOCK_TIME_LIMIT int "Spin lock holding time limit in cycles" default 0 depends on SPIN_VALIDATE depends on SYSTEM_CLOCK_LOCK_FREE_COUNT help Assert at the time of unlocking the number of system clock cycles the lock has been held is less than the configured value. Requires the timer driver sys_clock_get_cycles_32() be lock free. endif # ASSERT config FORCE_NO_ASSERT bool "Force-disable no assertions" help This boolean option disables Zephyr assertion testing even in circumstances (twister) where it is enabled via CFLAGS and not Kconfig. Added solely to be able to work around compiler bugs for specific tests. config ASSERT_VERBOSE bool "Verbose assertions" default y depends on PRINTK help This option enables printing an assert message with information about the assertion that occurred. This includes printing the location, the conditional expression and additional message specific to the assert. config ASSERT_NO_FILE_INFO bool "Disable file info for asserts" help This option removes the name and the path of the source file in which the assertion occurred. Enabling this will save target code space, and thus may be necessary for tiny targets. config ASSERT_NO_COND_INFO bool "Disable condition info for asserts" help This option removes the assert condition from the printed assert message. Enabling this will save target code space, and thus may be necessary for tiny targets. It is recommended to disable condition info before disabling file info since the condition can be found in the source using file info. config ASSERT_NO_MSG_INFO bool "Disable message for asserts" help This option removes the additional message from the printed assert. Enabling this will save target code space, and thus may be necessary for tiny targets. It is recommended to disable message before disabling file info since the message can be found in the source using file info. config ASSERT_TEST bool "Assert test mode" help This option enables the assert test mode, which allows the assert post action handler to return (i.e. not abort) when the asserted condition is false. The tests that validate the assert feature may select this option to allow the test to proceed by implementing a custom assert post action hook. config OVERRIDE_FRAME_POINTER_DEFAULT bool "Override compiler defaults for -fomit-frame-pointer" help Omitting the frame pointer prevents the compiler from putting the stack frame pointer into a register. Saves a few instructions in function prologues/epilogues and frees up a register for general-purpose use, which can provide good performance improvements on register-constrained architectures like x86. On some architectures (including x86) omitting frame pointers impedes debugging as local variables are harder to locate. At -O1 and above gcc will enable -fomit-frame-pointer automatically but only if the architecture does not require if for effective debugging. Choose Y if you want to override the default frame pointer behavior of your compiler, otherwise choose N. config OMIT_FRAME_POINTER bool "Omit frame pointer" depends on !FRAME_POINTER depends on OVERRIDE_FRAME_POINTER_DEFAULT help Choose Y for best performance. On some architectures (including x86) this will favor code size and performance over debuggability. Choose N in you wish to retain the frame pointer. This option may be useful if your application uses runtime backtracing and does not support parsing unwind tables. If unsure, disable OVERRIDE_FRAME_POINTER_DEFAULT to allow the compiler to adopt sensible defaults for your architecture. # # Generic Debugging Options # config EXCEPTION_STACK_TRACE bool "Attempt to print stack traces upon exceptions" default y depends on ARCH_STACKWALK help If the architecture fatal handling code supports it, attempt to print a stack trace of function memory addresses when an exception is reported. # # Miscellaneous debugging options # config DEBUG_THREAD_INFO bool "Thread awareness support" depends on !SMP select THREAD_MONITOR select THREAD_NAME help This option exports an array of offsets to kernel structs to allow for debugger RTOS plugins to determine the state of running threads. rsource "coredump/Kconfig" rsource "symtab/Kconfig" endmenu rsource "gdbstub/Kconfig" config SEGGER_DEBUGMON bool "Use Segger's J-Link debug monitor implementation" depends on CORTEX_M_DEBUG_MONITOR_HOOK help This option will enable Segger's implementation of the debug monitor interrupt, overriding the default z_arm_debug_monitor symbol. config MIPI_STP_DECODER bool "MIPI STPv2 decoder" depends on !BIG_ENDIAN help Module decodes a stream of STPv2 data. config CS_TRACE_DEFMT bool "Coresight Trace Deformatter" help Module is decoding data which is formatted using Coresight Trace Formatter, e.g. when data is put into ETR (Embedded Trace Router). config CPU_LOAD select TRACING depends on CPU_CORTEX_M || RISCV depends on !SMP bool "CPU load measurement" # Workaround for not being able to have commas in macro arguments DT_CHOSEN_Z_CPU_LOAD_COUNTER := zephyr,cpu-load-counter config CPU_LOAD_USE_COUNTER bool "Use counter" depends on $(dt_chosen_enabled,$(DT_CHOSEN_Z_CPU_LOAD_COUNTER)) default y select COUNTER help Use counter for tracking CPU idle time. config CPU_LOAD_LOG_PERIODICALLY int "Report period (in milliseconds)" depends on LOG default 0 help Specifies how often CPU load shall be logged. 0 means that there is no logging. module = CPU_LOAD module-str = cpu_load source "subsys/logging/Kconfig.template.log_config"