blob: a94b96d44ce56138ef2954a013e30371a9533d84 [file] [log] [blame]
# Debug configuration options
# Copyright (c) 2015 Wind River Systems, Inc.
# SPDX-License-Identifier: Apache-2.0
menu "System Monitoring Options"
menuconfig THREAD_ANALYZER
bool "Thread analyzer"
depends on !ARCH_POSIX
select INIT_STACKS
select THREAD_MONITOR
select THREAD_STACK_INFO
select THREAD_RUNTIME_STATS
help
Enable thread analyzer functionality and all the required modules.
This module may be used to debug thread configuration issues, e.g.
stack size configuration to find stack overflow or to find stacks
which may be optimized.
if THREAD_ANALYZER
module = THREAD_ANALYZER
module-str = thread analyzer
source "subsys/logging/Kconfig.template.log_config"
choice
prompt "Thread analysis print mode"
config THREAD_ANALYZER_USE_LOG
bool "Use logger output"
select LOG
help
Use logger output to print thread information.
config THREAD_ANALYZER_USE_PRINTK
bool "Use printk function"
help
Use kernel printk function to print thread information.
endchoice
config THREAD_ANALYZER_ISR_STACK_USAGE
bool "Analyze interrupt stacks usage"
default y
config THREAD_ANALYZER_RUN_UNLOCKED
bool "Run analysis with interrupts unlocked"
default y
help
The thread analysis takes quite a long time.
Every thread it finds is analyzed word by word to find any that
does not match the magic number.
Normally while thread are analyzed the k_thread_foreach function
is used.
While this is a safe run from the thread list perspective it may lock
the interrupts for a long time - long enough to disconnect when
Bluetooth communication is used.
Setting this flag will force thread analyzer to use
the k_thread_foreach_unlocked function.
This will allow the interrupts to be processed while the thread is
analyzed.
For the limitation of such configuration see the k_thread_foreach
documentation.
config THREAD_ANALYZER_AUTO
bool "Run periodic thread analysis in a thread"
help
Run the thread analyzer automatically, without the need to add
any code to the application.
Thread analysis would be called periodically.
if THREAD_ANALYZER_AUTO
config THREAD_ANALYZER_AUTO_INTERVAL
int "Thread analysis interval"
default 60
range 5 3600
help
The time in seconds to call thread analyzer periodic printing function.
config THREAD_ANALYZER_AUTO_STACK_SIZE
int "Stack size for the periodic thread analysis thread"
default 2048 if THREAD_ANALYZER_USE_LOG && LOG_MODE_IMMEDIATE && NO_OPTIMIZATIONS
default 1024
endif # THREAD_ANALYZER_AUTO
endif # THREAD_ANALYZER
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, "<unknown module>" 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"
depends on ARCH_POSIX
help
Builds Zephyr with Undefined Behavior Sanitizer enabled.
This is currently only supported by boards based on the posix
architecture, and requires a recent-ish compiler with the
``-fsanitize=undefined`` command line option.
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_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
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 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 DEBUG_INFO
bool "System debugging information"
help
This option enables the addition of various information that can be
used by debuggers in debugging the system, or enable additional
debugging information to be reported at runtime.
config EXCEPTION_STACK_TRACE
bool "Attempt to print stack traces upon exceptions"
default y
depends on PRINTK
depends on DEBUG_INFO
depends on !OMIT_FRAME_POINTER
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"
endmenu
config GDBSTUB
bool "GDB remote serial protocol support [EXPERIMENTAL]"
depends on ARCH_HAS_GDBSTUB
select EXPERIMENTAL
help
This option enable support the target using GDB, or any other
application that supports GDB protocol.
if GDBSTUB
choice
prompt "GDB backend"
config GDBSTUB_SERIAL_BACKEND
bool "Use serial backend"
depends on SERIAL
help
Use serial as backend for GDB
endchoice
config GDBSTUB_BUF_SZ
int "GDB backend send/receive buffer size (in bytes)"
default 256
help
This specifies the size (in bytes) of the send/receive buffer
for GDB backend. This needs to be big enough to hold one
full GDB packet at a time.
endif
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.