• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP32 и проблемы с динамическим выделением памяти, точнее с освобождением.

Slacky

Member
Заметил, что часто модуль перегружается с вот такими сообщениями
Код:
CORRUPT HEAP: Bad tail at 0x3ffb7f44. Expected 0xbaad5678 got 0x003a7465
abort() was called at PC 0x400824ee on core 1
0x400824ee: lock_acquire_generic at C:/msys32/esp-idf/components/newlib/locks.c:142


ELF file SHA256: d6237357b7b56e951d8125e4fb21a2311e29a00866e6b7b52eababfc391bf061

Backtrace: 0x40088add:0x3ffbb520 0x40088e6d:0x3ffbb540 0x400824ee:0x3ffbb560 0x40082611:0x3ffbb590 0x400eb439:0x3ffbb5b0 0x400e4911:0x3ffbb870 0x400e48a0:0x3ffbb8c0 0x40086e9d:0x3ffbb8f0 0x400840d2:0x3ffbb910 0x40083e23:0x3ffbb930 0x40083e99:0x3ffbb960 0x400d767e:0x3ffbb980 0x400d4c95:0x3ffbb9d0 0x40089121:0x3ffbba50
0x40088add: invoke_abort at C:/msys32/esp-idf/components/esp32/panic.c:157

0x40088e6d: abort at C:/msys32/esp-idf/components/esp32/panic.c:174

0x400824ee: lock_acquire_generic at C:/msys32/esp-idf/components/newlib/locks.c:142

0x40082611: _lock_acquire_recursive at C:/msys32/esp-idf/components/newlib/locks.c:170

0x400eb439: _vfiprintf_r at /builds/idf/crosstool-NG/.build/HOST-i686-w64-mingw32/xtensa-esp32-elf/src/newlib/newlib/libc/stdio/vfprintf.c:853 (discriminator 2)

0x400e4911: fiprintf at /builds/idf/crosstool-NG/.build/HOST-i686-w64-mingw32/xtensa-esp32-elf/src/newlib/newlib/libc/stdio/fiprintf.c:48

0x400e48a0: __assert_func at /builds/idf/crosstool-NG/.build/HOST-i686-w64-mingw32/xtensa-esp32-elf/src/newlib/newlib/libc/stdlib/assert.c:58 (discriminator 8)

0x40086e9d: multi_heap_free at C:/msys32/esp-idf/components/heap/multi_heap_poisoning.c:294 (discriminator 1)

0x400840d2: heap_caps_free at C:/msys32/esp-idf/components/heap/heap_caps.c:272

0x40083e23: trace_free at C:/msys32/esp-idf/components/heap/include/heap_trace.inc:117

0x40083e99: __wrap_free at C:/msys32/esp-idf/components/heap/include/heap_trace.inc:162

0x400d767e: send_to_server at C:\Users\SlackyStation\eclipse-workspaceESP32\alarm_esp32_sim800l\build/../main/utils.c:481 (discriminator 1)

0x400d4c95: main_task at C:\Users\SlackyStation\eclipse-workspaceESP32\alarm_esp32_sim800l\build/../main/main.c:298

0x40089121: vPortTaskWrapper at C:/msys32/esp-idf/components/freertos/xtensa/port.c:143


Rebooting...
Лезем в utils.c в 481 строку, а там тупо выполнение функции free. Причем до этого в другом месте была проблема с переопределением памяти по realloc, тоже на нем падал, я устал бороться и тупо убрал realloc и сделал статический буфер, типа char buffer[256] и все заработало. А код простой

C:
void send_to_server() {

    char *phone2         = NULL;
    char *phone3         = NULL;
    char *gpassword     = NULL;
    char *balance         = NULL;
    char *apn             = NULL;
    char *alarm         = NULL;
    char *temp            = NULL;
    char *extp            = NULL;
    char *module_name     = get_config_module_name();

    char *buffer = calloc(2, COMMAND_LINE_SIZE);
    if (!buffer) {
        ESP_LOGE(TAG, "calloc buffer failed");
        goto err;
    }

    phone2 = calloc(PHONE_SIZE+STR_DEFAULT_SIZE, sizeof(uint8_t));
    if (!phone2) {
        ESP_LOGE(TAG, "calloc phone2 failed");
        goto err;
    }
    if (server_phone2) {
        if (get_config_phone_set(WLIST2)) {
            sprintf(phone2, "phone2=%s,set:", get_config_phone(WLIST2));
        } else {
            sprintf(phone2, "phone2=%s,set:", PHONE_DEFAULT);
        }
    } else {
        if (get_config_phone_set(WLIST2)) {
            sprintf(phone2, "phone2=%s:", get_config_phone(WLIST2));
        }
    }


    /* и так далее и потом заполнение данными переменных */
    
err:

    if (buffer) free(buffer);
    if (phone2) free(phone2);
    if (phone3) free(phone3);
    if (gpassword) free(gpassword);
    if (balance) free(balance);
    if (apn) free(apn);
    if (alarm) free(alarm);
    if (temp) free(temp);

}
А 481 строка - это if (gpassword) free(gpassword);

Вопрос - это все-таки у меня какой-то косяк? Как поймать, что там рушится?

Спасибо.
 
Сверху Снизу