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;