• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);

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

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