Slacky
Member
Заметил, что часто модуль перегружается с вот такими сообщениями
Лезем в utils.c в 481 строку, а там тупо выполнение функции free. Причем до этого в другом месте была проблема с переопределением памяти по realloc, тоже на нем падал, я устал бороться и тупо убрал realloc и сделал статический буфер, типа char buffer[256] и все заработало. А код простой
А 481 строка - это if (gpassword) free(gpassword);
Вопрос - это все-таки у меня какой-то косяк? Как поймать, что там рушится?
Спасибо.
Код:
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...
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);
}
Вопрос - это все-таки у меня какой-то косяк? Как поймать, что там рушится?
Спасибо.