This is an automated email from Gerrit. "R. Diez <[email protected]>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/9432
-- gerrit commit 6bf44d3509aaae7d830c6e31bb3730b573da9fa5 Author: R. Diez <[email protected]> Date: Mon Feb 2 18:00:49 2026 +0100 configure.ac: Replace --enable-malloc-logging with a new runtime log level. About why the new log level LOG_LVL_DEBUG_USB has the same value a LOG_LVL_DEBUG_MALLOC, see the mailing list discussion starting here: Replacing --enable-verbose-usb-comms in configure.ac https://sourceforge.net/p/openocd/mailman/message/59215751/ Other minor fixes included here which are probably not worth submmitting in separate patches: - In error message "level must be between -3 and 4", increase 4 to 5. - LOG_DEBUG_IO was passing LOG_LVL_DEBUG instead of LOG_LVL_DEBUG_IO. Change-Id: I71440bbabe4785338c0a27562cc76fa1b7d54bf5 Signed-off-by: R. Diez <[email protected]> diff --git a/configure.ac b/configure.ac index c452cf5d3d..a0638b1c81 100644 --- a/configure.ac +++ b/configure.ac @@ -96,8 +96,8 @@ AC_CHECK_FUNCS([strnlen]) AC_CHECK_FUNCS([gettimeofday]) AC_CHECK_FUNCS([usleep]) AC_CHECK_FUNCS([realpath]) -AC_CHECK_FUNCS([mallinfo], [has_at_least_one_mallinfo=yes]) -AC_CHECK_FUNCS([mallinfo2], [has_at_least_one_mallinfo=yes]) +AC_CHECK_FUNCS([mallinfo]) +AC_CHECK_FUNCS([mallinfo2]) # guess-rev.sh only exists in the repository, not in the released archives AC_MSG_CHECKING([whether to build a release]) @@ -264,21 +264,6 @@ AS_IF([test "x$enable_gcov" = "xyes"], [ AC_DEFINE([USE_GCOV], [0], [0 to leave coverage collection disabled.]) ]) -debug_malloc=no -AC_ARG_ENABLE([malloc_logging], - AS_HELP_STRING([--enable-malloc-logging], - [Include free space in logging messages (requires malloc.h).]), - [debug_malloc=$enableval], []) - -AC_MSG_CHECKING([whether to enable malloc free space logging]); -AC_MSG_RESULT([$debug_malloc]) -AS_IF([test "x$debug_malloc" = "xyes"], [ - AS_IF([test "x$has_at_least_one_mallinfo" != "xyes"], [ - AC_MSG_ERROR([Option --enable-malloc-logging needs a libc with mallinfo or mallinfo2.]) - ]) - AC_DEFINE([_DEBUG_FREE_SPACE_],[1], [Include malloc free space in logging]) -]) - m4_define([AC_ARG_ADAPTERS], [ m4_foreach([adapter_driver], [$1], [AC_ARG_ENABLE(ADAPTER_OPT([adapter_driver]), diff --git a/doc/openocd.texi b/doc/openocd.texi index 325235bb7b..98ebdd5d84 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -9567,7 +9567,8 @@ level 1 adds warnings; level 2 adds informational messages; level 3 adds debugging messages; level 4 adds verbose low-level debug messages; -and level 5 adds USB communication messages. +and level 5 adds USB communication messages +and amount of free heap space if mallinfo is available. The default is level 2, but that can be overridden on the command line along with the location of that log file (which is normally the server's standard output). diff --git a/src/helper/log.c b/src/helper/log.c index caed8a9da3..06d3810557 100644 --- a/src/helper/log.c +++ b/src/helper/log.c @@ -24,8 +24,8 @@ #include <stdarg.h> -#ifdef _DEBUG_FREE_SPACE_ -#include <malloc.h> // For mallinfo/mallinfo2. +#if defined(HAVE_MALLINFO) || defined(HAVE_MALLINFO2) +#include <malloc.h> #endif int debug_level = LOG_LVL_INFO; @@ -101,30 +101,35 @@ static void log_puts(enum log_levels level, if (LOG_LEVEL_IS(LOG_LVL_DEBUG)) { /* print with count and time information */ int64_t t = timeval_ms() - start; -#ifdef _DEBUG_FREE_SPACE_ + +#if defined(HAVE_MALLINFO) || defined(HAVE_MALLINFO2) + const int should_use_mallinfo = LOG_LEVEL_IS(LOG_LVL_DEBUG_MALLOC); + + if (should_use_mallinfo) { #ifdef HAVE_MALLINFO2 - struct mallinfo2 info = mallinfo2(); -#elif defined(HAVE_MALLINFO) - struct mallinfo info = mallinfo(); + struct mallinfo2 info = mallinfo2(); #else -#error "Configuration error: Neither mallinfo() nor mallinfo2() are available." + struct mallinfo info = mallinfo(); #endif -#endif - fprintf(log_output, "%s%u %" PRId64 " %s:%d %s()" -#ifdef _DEBUG_FREE_SPACE_ + + fprintf(log_output, "%s%u %" PRId64 " %s:%d %s()" #ifdef HAVE_MALLINFO2 - " %zu" -#elif defined(HAVE_MALLINFO) - " %d" + " %zu" #else -#error "Configuration error: Neither mallinfo() nor mallinfo2() are available." + " %d" #endif + ": %s", log_strings[level + 1], count, t, file, line, function, + info.fordblks, + string); + } +#else + const int should_use_mallinfo = 0; #endif - ": %s", log_strings[level + 1], count, t, file, line, function, -#ifdef _DEBUG_FREE_SPACE_ - info.fordblks, -#endif - string); + if (!should_use_mallinfo) { + fprintf(log_output, "%s%u %" PRId64 " %s:%d %s()" + ": %s", log_strings[level + 1], count, t, file, line, function, + string); + } } else { /* if we are using gdb through pipes then we do not want any output * to the pipe otherwise we get repeated strings */ @@ -211,7 +216,7 @@ COMMAND_HANDLER(handle_debug_level_command) int new_level; COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], new_level); if (new_level > LOG_LVL_DEBUG_USB || new_level < LOG_LVL_SILENT) { - command_print(CMD, "level must be between %d and %d", LOG_LVL_SILENT, LOG_LVL_DEBUG_IO); + command_print(CMD, "level must be between %d and %d", LOG_LVL_SILENT, LOG_LVL_DEBUG_USB); return ERROR_COMMAND_ARGUMENT_INVALID; } debug_level = new_level; diff --git a/src/helper/log.h b/src/helper/log.h index 07c195d282..01917abe23 100644 --- a/src/helper/log.h +++ b/src/helper/log.h @@ -40,6 +40,10 @@ * LOG_LVL_DEBUG_USB - verbose USB trace * In the past this corresponded to build configuration options --enable-verbose and --enable-verbose-usb-comms. + * LOG_LVL_DEBUG_MALLOC - log messages will include the amount of free heap space + * maintained by malloc in its free list, if mallinfo is available. + * In the past this corresponded to build configuration + * option --enable-malloc-logging. */ enum log_levels { LOG_LVL_SILENT = -3, @@ -50,7 +54,10 @@ enum log_levels { LOG_LVL_INFO = 2, LOG_LVL_DEBUG = 3, LOG_LVL_DEBUG_IO = 4, + // LOG_LVL_DEBUG_USB and LOG_LVL_DEBUG_MALLOC have the same value at the moment. + // In the future, these logging categories will be individually switchable. LOG_LVL_DEBUG_USB = 5, + LOG_LVL_DEBUG_MALLOC = 5, }; void log_printf(enum log_levels level, const char *file, unsigned int line, @@ -109,7 +116,7 @@ extern int debug_level; #define LOG_DEBUG_IO(expr ...) \ do { \ if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) \ - log_printf_lf(LOG_LVL_DEBUG, \ + log_printf_lf(LOG_LVL_DEBUG_IO, \ __FILE__, __LINE__, __func__, \ expr); \ } while (0) --
