From 444002180bca8e36b3014eaf5ecf5e690837b440 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 14 Mar 2021 07:57:23 +0100 Subject: [PATCH] OOM debug: warn about String reallocation (#7908) * OOM debug: warn about String reallocation * threshold set to 128 bytes, +defines * warn only when capacity had already reached the threshold --- cores/esp8266/WString.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cores/esp8266/WString.cpp b/cores/esp8266/WString.cpp index 0793633aee..19a4143ecf 100644 --- a/cores/esp8266/WString.cpp +++ b/cores/esp8266/WString.cpp @@ -25,6 +25,12 @@ #include "WString.h" #include "stdlib_noniso.h" +#define OOM_STRING_BORDER_DISPLAY 10 +#define OOM_STRING_THRESHOLD_REALLOC_WARN 128 + +#define __STRHELPER(x) #x +#define STR(x) __STRHELPER(x) // stringifier + /*********************************************/ /* Constructors */ /*********************************************/ @@ -178,6 +184,14 @@ unsigned char String::changeBuffer(unsigned int maxStrLen) { } // Fallthrough to normal allocator size_t newSize = (maxStrLen + 16) & (~0xf); +#ifdef DEBUG_ESP_OOM + if (!isSSO() && capacity() >= OOM_STRING_THRESHOLD_REALLOC_WARN && maxStrLen > capacity()) { + // warn when badly re-allocating + DEBUGV("[offending String op %d->%d ('%." STR(OOM_STRING_BORDER_DISPLAY) "s ... %." STR(OOM_STRING_BORDER_DISPLAY) "s')]\n", + len(), maxStrLen, c_str(), + len() > OOM_STRING_BORDER_DISPLAY? c_str() + std::max((int)len() - OOM_STRING_BORDER_DISPLAY, OOM_STRING_BORDER_DISPLAY): ""); + } +#endif // Make sure we can fit newsize in the buffer if (newSize > CAPACITY_MAX) { return 0;