8000 Core dump during FTP file transfer, caused by a heap lock. · Issue #443 · pycom/pycom-micropython-sigfox · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Core dump during FTP file transfer, caused by a heap lock. #443

Closed
robert-hh opened this issue May 10, 2020 · 15 comments
Closed

Core dump during FTP file transfer, caused by a heap lock. #443

robert-hh opened this issue May 10, 2020 · 15 comments

Comments

@robert-hh
Copy link
Contributor
robert-hh commented May 10, 2020

Pycom MicroPython 1.20.2.rc7 [v1.20.1.r2-142-g6d01270-dirty] on 2020-05-10; LoPy4 with ESP32

This is the "a smoking gun" for a fault, which made me hate LittleFS. It happens when I do other activities in REPL or an active Python script during or shortly after making FTP file transfers. Replacing m_malloc() by malloc() in lfs_util.h solved the problem, and now I found the reason, but at another place than assumed. Below is the backtrace and the core dump. The reason is, that lfs tries to allocate memory for a buffer, but the heap is locked at that very moment. m_malloc() then raises an execption, which causes the core dump, since is happens outside the MP process. Since malloc() does not use the heap, the problem does not occur. This actual event happend in ftp.c which is calling m_malloc here, but at that place m_ malloc was also identified as critical by @amotl. It may be the general problem, that background processes must not use m_malloc.
Note: in my modified ftp.c I had replaced m_malloc() since long my malloc(). Still there is the omission in ftp.c, that malloc() is not checked for returning NULL. m_malloc() did not need that, because it would raise an exception, which for the ftpserver leads to a crash.

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x400f66da  PS      : 0x00060c30  A0      : 0x800fe6fe  A1      : 0x3ffdba80  
A2      : 0x3ffc93ec  A3      : 0x3f40d2df  A4      : 0x3ffc93d4  A5      : 0x00000008  
A6      : 0x20200408  A7      : 0x0000042f  A8      : 0x800f66da  A9      : 0x3ffdba60  
A10     : 0x00000000  A11     : 0x00000000  A12     : 0x3f40f684  A13     : 0x00000000  
A14     : 0x3f40e08c  A15     : 0x00000000  SAR     : 0x00000018  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000010  LBEG    : 0x40093d79  LEND    : 0x40093d89  LCOUNT  : 0xfffffffd  

ELF file SHA256: 0000000000000000000000000000000000000000000000000000000000000000

Backtrace: 0x400f66da:0x3ffdba80 0x400fe6fb:0x3ffdbaa0 0x400fe712:0x3ffdbac0 0x400f6712:0x3ffdbae0 0x400f50bc:0x3ffdbb00 0x400f5324:0x3ffdbb30 0x400f6006:0x3ffdbfa0 0x400e0240:0x3ffdbfd0



Simple backtrace:

BT-0: 0x400f66da is in nlr_jump (../py/nlrsetjmp.c:33).
33	    nlr_buf_t *top = *top_ptr;
BT-1: 0x400fe6fb is in mp_raise_msg (../py/runtime.c:1465).
1465	        nlr_raise(mp_obj_new_exception_msg(exc_type, msg));
BT-2: 0x400fe712 is in m_malloc_fail (../py/runtime.c:1454).
1454	        mp_raise_msg(&mp_type_MemoryError, "memory allocation failed, heap is locked");
BT-3: 0x400f6712 is in m_malloc (../py/malloc.c:88).
88	        m_malloc_fail(num_bytes);
BT-4: 0x400f50bc is in f_readdir_helper (ftp/ftp.c:341).
341	                char* file_relative_path = m_malloc(path_length);
BT-5: 0x400f5324 is in ftp_list_dir (ftp/ftp.c:1455).
1455	            f_readdir_helper(&ftp_data.u.dp, &fno);
BT-6: 0x400f6006 is in ftp_run (ftp/ftp.c:672).
672	                ftp_list_dir((char *)ftp_data.dBuffer, FTP_BUFFER_SIZE, &listsize);
BT-7: 0x400e0240 is in TASK_Servers (serverstask.c:105).
105	            ftp_run();

Core dump analysis:
==================== ESP32 CORE DUMP START ====================

Crashed task handle: 0x3ffbd550, name: 'Servers', GDB name: 'process 1073468752'

================== CURRENT THREAD REGISTERS ===================
exccause       0x0 (IllegalInstructionCause)
excvaddr       0x0
epc1           0x0
epc2           0x0
epc3           0x0
epc4           0x0
epc5           0x0
epc6           0x1c
epc7           0x10
eps2           0x0
eps3           0x0
eps4           0x0
eps5           0x0
eps6           0x0
eps7           0x0
pc             0x400f66da	0x400f66da <nlr_jump+6>
lbeg           0x40093d79	1074347385
lend           0x40093d89	1074347401
lcount         0xfffffffd	4294967293
sar            0x18	24
ps             0x60c20	396320
threadptr      <unavailable>
br             <unavailable>
scompare1      <unavailable>
acclo          <unavailable>
acchi          <unavailable>
m0             <unavailable>
m1             <unavailable>
m2             <unavailable>
m3             <unavailable>
expstate       <unavailable>
f64r_lo        <unavailable>
f64r_hi        <unavailable>
f64s           <unavailable>
fcr            <unavailable>
fsr            <unavailable>
a0             0x800fe6fe	-2146441474
a1             0x3ffdba80	1073592960
a2             0x3ffc93ec	1073517548
a3             0x3f40d2df	1061212895
a4             0x3ffc93d4	1073517524
a5             0x8	8
a6             0x20200408	538969096
a7             0x42f	1071
a8             0x800f66da	-2146474278
a9             0x3ffdba60	1073592928
a10            0x0	0
a11            0x0	0
a12            0x3f40f684	1061222020
a13            0x0	0
a14            0x3f40e08c	1061216396
a15            0x0	0

==================== CURRENT THREAD STACK =====================
#0  nlr_jump (val=0x3ffc93ec <mp_state_ctx+24>) at ../py/nlrsetjmp.c:33
#1  0x400fe6fe in mp_raise_msg (exc_type=0x3f40e08c <mp_type_MemoryError>, msg=0x3f40d2df \"memory allocation failed, heap is locked\") at ../py/runtime.c:1465
#2  0x400fe715 in m_malloc_fail (num_bytes=10) at ../py/runtime.c:1454
#3  0x400f6715 in m_malloc (num_bytes=10) at ../py/malloc.c:88
#4  0x400f50bf in f_readdir_helper (fno=0x3ffdbb40, dp=0x3ffc9308 <ftp_data+8>) at ftp/ftp.c:341
#5  0x400f5327 in ftp_list_dir (list=0x3ffdd05c <error: Cannot access memory at address 0x3ffdd05c>, listsize=0x3ffdbfa0, maxlistsize=512) at ftp/ftp.c:1455
#6  0x400f6009 in ftp_run () at ftp/ftp.c:672
#7  0x400e0243 in TASK_Servers (pvParameters=<optimized out>) at serverstask.c:105

======================== THREADS INFO =========================
  Id   Target Id         Frame 
  17   process 1073460060 0x4000bff0 in ?? ()
  16   process 1073443452 0x40095e0c in xQueueGenericReceive (xQueue=0x3ffc4020 <s_timer_semaphore_memory>, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/componen
8000
ts/freertos/queue.c:1592
  15   process 1073431364 0x40095e0c in xQueueGenericReceive (xQueue=0x3ffb2e50, pvBuffer=0x3ffb42a0, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
  14   process 1073445480 0x40095e0c in xQueueGenericReceive (xQueue=0x3ffb760c, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
  13   process 1073599348 0x40095e0c in xQueueGenericReceive (xQueue=0x3ffbd6c0, pvBuffer=0x3ffdf430, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
  12   process 1073459516 0x40095e0c in xQueueGenericReceive (xQueue=0x3ffd85f4, pvBuffer=0x3ffd9790, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
  11   process 1073445936 0x40081634 in esp_crosscore_int_send_yield (core_id=1) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/crosscore_int.c:112
  10   process 1073558400 0x4000bff0 in ?? ()
  9    process 1073469464 0x4000bff0 in ?? ()
  8    process 1073466144 /builds/idf/crosstool-NG/.build/src/gdb-7.10/gdb/inline-frame.c:171: internal-error: inline_frame_this_id: Assertion `!frame_id_eq (*this_id, outer_frame_id)' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) [answered Y; input not from terminal]
/builds/idf/crosstool-NG/.build/src/gdb-7.10/gdb/inline-frame.c:171: internal-error: inline_frame_this_id: Assertion `!frame_id_eq (*this_id, outer_frame_id)' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Create a core file of GDB? (y or n) [answered Y; input not from terminal]
ERROR: GDB exited (None / )!
ERROR: Problem occured! GDB exited, restart it.
Reading symbols from ../esp32/build/LOPY4/release/application.elf...done.
[New process 1073468752]
[New process 1073497548]
[New process 1073554956]
[New process 1073461568]
[New process 1073462964]
[New process 1073459148]
[New process 1073562356]
[New process 1073466144]
[New process 1073469464]
[New process 1073558400]
[New process 1073445936]
[New process 1073459516]
[New process 1073599348]
[New process 1073445480]
[New process 1073431364]
[New process 1073443452]
[New process 1073460060]
[Current thread is 1 (process 1073468752)]

==================== THREAD 17 (TCB: 0x3ffbb35c, name: 'SmartConfig') =====================
#-1 0x4000bff0 in ?? ()
Backtrace stopped: Cannot access memory at address 0x4000bff0

==================== THREAD 16 (TCB: 0x3ffb727c, name: 'esp_timer') =====================
#0  0x40095e0c in xQueueGenericReceive (xQueue=0x3ffc4020 <s_timer_semaphore_memory>, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
#1  0x400d246d in timer_task (arg=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/esp_timer.c:324

==================== THREAD 15 (TCB: 0x3ffb4344, name: 'wifi') =====================
#0  0x40095e0c in xQueueGenericReceive (xQueue=0x3ffb2e50, pvBuffer=0x3ffb42a0, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
#1  0x401723dd in queue_recv_wrapper (queue=0x3ffb2e50, item=0x3ffb42a0, block_time_tick=4294967295) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/esp_adapter.c:342
#2  0x40156bd1 in ppTask ()

==================== THREAD 14 (TCB: 0x3ffb7a68, name: 'ipc0') =====================
#0  0x40095e0c in xQueueGenericReceive (xQueue=0x3ffb760c, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
#1  0x40081e1c in ipc_task (arg=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/ipc.c:51

==================== THREAD 13 (TCB: 0x3ffdd374, name: 'IRQs') =====================
#0  0x40095e0c in xQueueGenericReceive (xQueue=0x3ffbd6c0, pvBuffer=0x3ffdf430, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
#1  0x400f3eec in TASK_Interrupts (pvParameters=<optimized out>) at util/mpirq.c:61
#2  0x400e0854 in freertos_entry (arg=0x3ffc924c <mpirq_args>) at mpthreadport.c:140

==================== THREAD 12 (TCB: 0x3ffbb13c, name: 'eventTask') =====================
#0  0x40095e0c in xQueueGenericReceive (xQueue=0x3ffd85f4, pvBuffer=0x3ffd9790, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
#1  0x401725ac in esp_event_loop_task (pvParameters=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/event_loop.c:53

==================== THREAD 11 (TCB: 0x3ffb7c30, name: 'ipc1') =====================
#0  0x40081634 in esp_crosscore_int_send_yield (core_id=1) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/crosscore_int.c:112
#1  0x40095e0c in xQueueGenericReceive (xQueue=0x3ffb7bd8, pvBuffer=0x0, xTicksToWait=4294967295, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
#2  0x40081e1c in ipc_task (arg=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/ipc.c:51

==================== THREAD 10 (TCB: 0x3ffd3380, name: 'LoRa_Timer_call') =====================
#-1 0x4000bff0 in ?? ()
Backtrace stopped: Cannot access memory at address 0x4000bff0

==================== THREAD 9 (TCB: 0x3ffbd818, name: 'Socket Operatio') =====================
#-1 0x4000bff0 in ?? ()
Backtrace stopped: Cannot access memory at address 0x4000bff0

ERROR: GDB exited (None / )!
ERROR: Problem occured! GDB exited, restart it.
ERROR: GDB exited (None / )!
ERROR: Problem occured! GDB exited, restart it.
WARNING: Unable to switch to thread 8

==================== THREAD 7 (TCB: 0x3ffd42f4, name: 'Sigfox') =====================
#0  0x40096c06 in vTaskDelay (xTicksToDelay=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/tasks.c:1484
#1  0x401f9156 in TASK_Sigfox (pvParameters=<optimized out>) at sigfox/src/modsigfox.c:301

==================== THREAD 6 (TCB: 0x3ffbafcc, name: 'tiT') =====================
#0  0x40095e0c in xQueueGenericReceive (xQueue=0x3ffb9f34, pvBuffer=0x3ffbaf30, xTicksToWait=9, xJustPeeking=0) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/queue.c:1592
#1  0x4018dbe1 in sys_arch_mbox_fetch (mbox=<optimized out>, msg=0x3ffbaf30, timeout=9) at /Users/ehlers/pycom/pycom-esp-idf/components/lwip/port/esp32/freertos/sys_arch.c:297
#2  0x401860b3 in sys_timeouts_mbox_fetch (mbox=0x3ffcfec8 <mbox>, msg=0x3ffbaf30) at /Users/ehlers/pycom/pycom-esp-idf/components/lwip/lwip/src/core/timeouts.c:430
#3  0x4017eb17 in tcpip_thread (arg=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/lwip/lwip/src/api/tcpip.c:109

==================== THREAD 5 (TCB: 0x3ffbbeb4, name: 'IDLE1') =====================
#0  0x40211b0e in esp_pm_impl_waiti () at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/pm_esp32.c:492
#1  0x401726da in esp_vApplicationIdleHook () at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/freertos_hooks.c:63
#2  0x40096de8 in prvIdleTask (pvParameters=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/tasks.c:3382

==================== THREAD 4 (TCB: 0x3ffbb940, name: 'IDLE0') =====================
#0  0x40211b0e in esp_pm_impl_waiti () at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/pm_esp32.c:492
#1  0x401726da in esp_vApplicationIdleHook () at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/freertos_hooks.c:63
#2  0x40096de8 in prvIdleTask (pvParameters=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/tasks.c:3382

==================== THREAD 3 (TCB: 0x3ffd260c, name: 'LoRa') =====================
#0  0x40081634 in esp_crosscore_int_send_yield (core_id=1) at /Users/ehlers/pycom/pycom-esp-idf/components/esp32/crosscore_int.c:112
#1  0x40096c06 in vTaskDelay (xTicksToDelay=<optimized out>) at /Users/ehlers/pycom/pycom-esp-idf/components/freertos/tasks.c:1484
#2  0x40112458 in TASK_LoRa (pvParameters=<optimized out>) at mods/modlora.c:804

==================== THREAD 2 (TCB: 0x3ffc45cc, name: 'MicroPy') =====================
#0  0x400f67d9 in gc_mark_subtree (block=<optimized out>) at ../py/gc.c:223
#1  0x400f69c8 in gc_collect_root (ptrs=<optimized out>, len=80) at ../py/gc.c:352
#2  gc_collect_start () at ../py/gc.c:334
#3  0x400f3b56 in gc_collect () at util/gccollect.c:50
#4  0x40107f2e in py_gc_collect () at ../py/modgc.c:35
#5  0x401016e9 in fun_builtin_0_call (self_in=0x3f41020c <gc_collect_obj>, n_args=0, n_kw=0, args=0x3f956e4c) at ../py/objfun.c:56
#6  0x400fdb2c in mp_call_function_n_kw (fun_in=0x3f41020c <gc_collect_obj>, n_args=0, n_kw=0, args=0x3f956e4c) at ../py/runtime.c:624
#7  0x400fdbbc in mp_call_method_n_kw (n_args=0, n_kw=0, args=0x3f956e44) at ../py/runtime.c:640
#8  0x40109b6a in mp_execute_bytecode (code_state=0x3f956e30, inject_exc=0x0) at ../py/vm.c:1002
#9  0x40101817 in fun_bc_call (self_in=<optimized out>, n_args=<optimized out>, n_kw=0, args=0x3ffd825c) at ../py/objfun.c:287
#10 0x400fdb2c in mp_call_function_n_kw (fun_in=0x3f94f6f0, n_args=1, n_kw=0, args=0x3ffd825c) at ../py/runtime.c:624
#11 0x40109adc in mp_execute_bytecode (code_state=0x3ffd8240, inject_exc=0x0) at ../py/vm.c:919
#12 0x40101817 in fun_bc_call (self_in=<optimized out>, n_args=<optimized out>, n_kw=0, args=0x0) at ../py/objfun.c:287
#13 0x400fdb2c in mp_call_function_n_kw (fun_in=0x3f9539a0, n_args=0, n_kw=0, args=0x0) at ../py/runtime.c:624
#14 0x400fdb59 in mp_call_function_0 (fun=0x3f9539a0) at ../py/runtime.c:598
#15 0x400e1470 in parse_compile_execute (source=0x3ffd8380, input_kind=MP_PARSE_SINGLE_INPUT, exec_flags=22) at ../lib/utils/pyexec.c:103
#16 0x400e16e7 in pyexec_friendly_repl () at ../lib/utils/pyexec.c:549
#17 0x400e015f in TASK_Micropython (pvParameters=<optimized out>) at mptask.c:341

==================== THREAD 1 (TCB: 0x3ffbd550, name: 'Servers') =====================
#0  nlr_jump (val=0x3ffc93ec <mp_state_ctx+24>) at ../py/nlrsetjmp.c:33
#1  0x400fe6fe in mp_raise_msg (exc_type=0x3f40e08c <mp_type_MemoryError>, msg=0x3f40d2df \"memory allocation failed, heap is locked\") at ../py/runtime.c:1465
#2  0x400fe715 in m_malloc_fail (num_bytes=10) at ../py/runtime.c:1454
#3  0x400f6715 in m_malloc (num_bytes=10) at ../py/malloc.c:88
#4  0x400f50bf in f_readdir_helper (fno=0x3ffdbb40, dp=0x3ffc9308 <ftp_data+8>) at ftp/ftp.c:341
#5  0x400f5327 in ftp_list_dir (list=0x3ffdd05c <error: Cannot access memory at address 0x3ffdd05c>, listsize=0x3ffdbfa0, maxlistsize=512) at ftp/ftp.c:1455
#6  0x400f6009 in ftp_run () at ftp/ftp.c:672
#7  0x400e0243 in TASK_Servers (pvParameters=<optimized out>) at serverstask.c:105


======================= ALL MEMORY REGIONS ========================
Name   Address   Size   Attrs
.rtc.text 0x400c0000 0x64 R XA
.rtc.data 0x50000000 0x81c RW A
.rtc_noinit 0x5000081c 0x0 RW  
.rtc.force_slow 0x5000081c 0x0 RW  
.iram0.vectors 0x40080000 0x400 R XA
.iram0.text 0x40080400 0x18854 R XA
.dram0.data 0x3ffbdb60 0x4940 RW A
.noinit 0x3ffc24a0 0x0 RW  
.flash.rodata 0x3f400020 0x36724 RW A
.flash.text 0x400d0018 0x1448bc R XA
.coredump.tasks.data 0x3ffbd550 0x16c RW 
.coredump.tasks.data 0x3ffdb9c0 0x690 RW 
.coredump.tasks.data 0x3ffc45cc 0x16c RW 
.coredump.tasks.data 0x3ffd7f10 0x6dc RW 
.coredump.tasks.data 0x3ffd260c 0x16c RW 
.coredump.tasks.data 0x3ffd23f0 0x214 RW 
.coredump.tasks.data 0x3ffbb940 0x16c RW 
.coredump.tasks.data 0x3ffbb7a0 0x198 RW 
.coredump.tasks.data 0x3ffbbeb4 0x16c RW 
.coredump.tasks.data 0x3ffbbd10 0x19c RW 
.coredump.tasks.data 0x3ffbafcc 0x16c RW 
.coredump.tasks.data 0x3ffbadd0 0x1f4 RW 
.coredump.tasks.data 0x3ffd42f4 0x16c RW 
.coredump.tasks.data 0x3ffd40e0 0x20c RW 
.coredump.tasks.data 0x3ffbcb20 0x16c RW 
.coredump.tasks.data 0x3ffbc9c0 0x158 RW 
.coredump.tasks.data 0x3ffbd818 0x16c RW 
.coredump.tasks.data 0x3ffdcec0 0x194 RW 
.coredump.tasks.data 0x3ffd3380 0x16c RW 
.coredump.tasks.data 0x3ffd31b0 0x1c8 RW 
.coredump.tasks.data 0x3ffb7c30 0x16c RW 
.coredump.tasks.data 0x3ffb9c90 0x1a8 RW 
.coredump.tasks.data 0x3ffbb13c 0x16c RW 
.coredump.tasks.data 0x3ffd9690 0x1b8 RW 
.coredump.tasks.data 0x3ffdd374 0x16c RW 
.coredump.tasks.data 0x3ffdf2d0 0x210 RW 
.coredump.tasks.data 0x3ffb7a68 0x16c RW 
.coredump.tasks.data 0x3ffb78e0 0x180 RW 
.coredump.tasks.data 0x3ffb4344 0x16c RW 
.coredump.tasks.data 0x3ffb4170 0x1cc RW 
.coredump.tasks.data 0x3ffb727c 0x16c RW 
.coredump.tasks.data 0x3ffb70e0 0x194 RW 
.coredump.tasks.data 0x3ffbb35c 0x16c RW 
.coredump.tasks.data 0x3ffda6b0 0x19c RW 

===================== ESP32 CORE DUMP END =====================
@peter-pycom
Copy link
Contributor

@robert-hh thanks for the detailed analysis and thanks for your (hopefully) patience. The GC alloc problem is being worked on right now. @salal-m please take this repro into account!

@salal-m
Copy link
Contributor
salal-m commented May 14, 2020

@robert-hh we have incorporated your suggestions with our changes. These solve the memory related crashes but I was not able to produce the scenario where heap is locked. Could you please verify if the attached dev build is stable in your scenario as well? Thanks.
LoPy4-1.20.2.rc7.tar.gz

@robert-hh
Copy link
Contributor Author

Yes, this is hard to trigger, when you want to. I will test it. I do not know what exactly you changed. Below is the function as I have it now, using malloc. At least for the m_malloc() exception, it should be possible to use it, when before the call a return frame is pushed with nlr_push() (and of course later removed with nlr_pop(). But looking at all other places in ftp.c where memory is allocated, it is consistent NOT to use m_malloc().

STATIC FRESULT f_readdir_helper(ftp_dir_t *dp, ftp_fileinfo_t *fno ) {

    if(isLittleFs(ftp_path))
    {

        vfs_lfs_struct_t* littlefs = lookup_path_littlefs(ftp_path, &path_relative);
        if (littlefs == NULL) {
            return FR_NO_PATH;
        }

        xSemaphoreTake(littlefs->mutex, portMAX_DELAY);

            int lfs_ret = lfs_dir_read(&littlefs->lfs, &dp->u.dp_lfs, &fno->u.fpinfo_lfs.info);

            // Fetch the timestamp for valid files, filter out empty, "." and ".." entries
            if((lfs_ret >= LFS_ERR_OK) &&
               !(fno->u.fpinfo_lfs.info.name[0] == 0) &&
               !(fno->u.fpinfo_lfs.info.name[0] == '.' && fno->u.fpinfo_lfs.info.name[1] == 0) &&
               !(fno->u.fpinfo_lfs.info.name[0] == '.' && fno->u.fpinfo_lfs.info.name[1] == '.' && fno->u.fpinfo_lfs.info.name[2] == 0))
            {
                // Length of the relative path
                size_t length_of_relative_path = strlen(path_relative);

                // Calculate the length of the relative path of the file with the name of the file plus closing /0
                size_t path_length = length_of_relative_path + strlen(fno->u.fpinfo_lfs.info.name) + 1;

                // If the current directory is not root directory need to append extra "/" at the end of relative path
                if(length_of_relative_path > 1) {
                    path_length++;
                }
                char* file_relative_path = malloc(path_length);

                if (file_relative_path) {

                    // Copy the current working directory (relative path)
                    memcpy(file_relative_path, path_relative, length_of_relative_path);

                    // Append the "/" at the end of current working directory path if needed
                    if(length_of_relative_path > 1) {
                        memcpy(&file_relative_path[length_of_relative_path], "/", 1);
                        // Modify the length of relative path to include the closing "/"
                        length_of_relative_path++;
                    }
                    // Copy the name of the file after the current working directory, this will copy the closing /0
                    strcpy(&file_relative_path[length_of_relative_path], fno->u.fpinfo_lfs.info.name);

                    int lfs_getattr_ret = lfs_getattr(&littlefs->lfs, file_relative_path, LFS_ATTRIBUTE_TIMESTAMP, &fno->u.fpinfo_lfs.timestamp, sizeof(lfs_timestamp_attribute_t));
                    // If no timestamp is saved for this entry, fill it with 0
                    if(lfs_getattr_ret < LFS_ERR_OK) {
                        fno->u.fpinfo_lfs.timestamp.fdate = 0;
                        fno->u.fpinfo_lfs.timestamp.ftime = 0;
                    }

                    free(file_relative_path);
                } else {
                    lfs_ret = LFS_ERR_IO;
                }
            }

        xSemaphoreGive(littlefs->mutex);

        return lfsErrorToFatFsError(lfs_ret);
    }
    else
    {
        FATFS *fs = lookup_path_fatfs(ftp_path, &path_relative);
        if (fs == NULL) {
            return FR_NO_PATH;
        }
        return f_readdir(&dp->u.dp_fat, &fno->u.fpinfo_fat);
    }
}

@salal-m
Copy link
Contributor
salal-m commented May 14, 2020

You are right, m_malloc() should not be used here. Even if the crash doesn't occur due to locked heap, there are instances of crashes due to invalid memory access (which most likely happens because GC collects that memory).
The changes mostly include memory allocations replaced by malloc() in all modules where it is to be used internally for non-MircoPython use. (including instances in PR #418)

@robert-hh
Copy link
Contributor Author
robert-hh commented May 14, 2020

Dang. I was optimistic, since I ran my old test for an hour and it worked fine. Then I started a different test, and that crashed. Since I do not have the elf file of your image, I cannot decode the core dump. So you just get the numbers. The test setup is simple. Use Filezilla to upload a bunch of files. In my case it were ~100 of different sizes. Then I run in REPL, connected through USB/UART:

import gc
import uos
import time
gc.threshold(500000)   # just to enforce a few more gc's
while True:
    print (list(uos.ilistdir()))
    time.sleep_ms(1)

Core dump:

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x4020f817  PS      : 0x00060630  A0      : 0x800f1de6  A1      : 0x3ffdb660  
A2      : 0x00010009  A3      : 0x3ffc9310  A4      : 0x3ffc47c0  A5      : 0xffffffff  
A6      : 0x00001000  A7      : 0x00000005  A8      : 0x00000001  A9      : 0x00000000  
A10     : 0x00000000  A11     : 0x00000001  A12     : 0x00000000  A13     : 0x00000001  
A14     : 0x3ffe6638  A15     : 0x3ffe6638  SAR     : 0x00000018  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00010009  LBEG    : 0x40093c20  LEND    : 0x40093c2b  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000000000000000000000000000000000000000000000000000

Backtrace: 0x4020f817:0x3ffdb660 0x400f1de3:0x3ffdb680 0x400f2584:0x3ffdb700 0x400f25d5:0x3ffdb740 0x400f370a:0x3ffdb760 0x400f52ca:0x3ffdb780 0x400f61e8:0x3ffdb7a0 0x400e0218:0x3ffdb7d0

================= CORE DUMP START =================
9D8AAAEAAAARAAAAbAEAAA==
sNX7P6C1/T9QuP0/
ALX9P/C3/T/8f0IA6EL8P+hC/D+w1fs/4EL8Pw4AAADgdfs/4HX7P7DV+z8AAAAA
CwAAAFSo/T9TZXJ2ZXJzAIzY+z8Q1vsAAQAAAFC4/T8AAAAAIAoGAAsAAAABAAAA
CEf7PwAAAAAAAAAAAAAAAIAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhBTg==
/////xf4IEAwBgYA5h0PgGC2/T8JAAEAEJP8P8BH/D//////ABAAAAUAAAABAAAA
AAAAAAAAAAABAAAAAAAAAAEAAAA4Zv4/OGb+PxgAAAAcAAAACQABACA8CUArPAlA
AAAAAAAAAAABAAAAzDMIQCyj+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAOskD4CAtv0/wEf8PwiT/D+HJQ+AgLb9PwAAAAAQk/w/
wEf8P/////8AEAAABQAAANglD4AAt/0/iDr+PwiT/D8AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAABAAAATQIAAAAAAAAAAAAA
KwMAAAAAAAAAEAAAyHH8PwAAAACwVgIAALf9P+R+CUAAABAAAgAAAMBH/D8BAAEA
DTcPgEC3/T/AR/w/CJP8PwgMICAQt/0/AQwgEIg6/j9BAQAATQIAAP4AAAAAAAAA
wEf8PxCT/D8BAAAAAAAAAM1SD4Bgt/0/wEf8PwiT/D+w1fs/AQAAAP4AAAAvAAAA
62EPgIC3/T/AR/w/AJP8P1yT/D9ok/w/AAAAAAAAAAAbAg6AoLf9PwCT/D8AAAAA
AAIAAAAAAAD+AAAAAAAAAAAAAADQt/0/MPj7PwAAAAAAAAAA0Lf9PwAAAAAAAAAA
gAAAAMBH/D8BAAAAAAAA/wAAAADwt/0/AAAAAAAAAAAAAAAAAQAAAEJK/D8AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Lf9PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAA==
DCb9PzAk/T8EJv0/
MCT9P6Al/T+6ckIAhEL8P4RC/D8MJv0/fEL8PxMAAABgFN2bhY8LCQwm/T8AAAAA
BgAAAAgW/T9Mb1JhABkdD0txNpOt4IIAAQAAAAQm/T8AAAAAIQAGAAYAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ38g==
MDQIQGwkEUAwCgYAAAAAAPAk/T+Ymfw/LJr8P6g1QT8AAAAALJr8PwAAAAAHLhGA
0CT9PwAAAAAsmvw/GCH+PwAAAAAAAAAAAAAAAAAAAADcEPo/AAAAAAAAAAAAAAAA
AAAAADA2CEAAAAAA5H4JQNwQ+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAABgh/j8AAAAAAAAAAAAAAAAAAAAAoCX9PwAAAAAAAAAA
oCX9PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDYIQAAAAADkfglA
3BD6PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
qDVBPwAAAAAsmvw/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKwl/T8AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
QLn7P6C3+z84ufs/
oLf7P9C4+z+UCZVyvL77PwxC/D9Aufs/BEL8PxkAAABnve8TDYAKOkC5+z8AAAAA
AAAAADy1+z9JRExFMABKNY9X77xulsUAAAAAADi5+z8AAAAAIQAGAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANllyw==
MDQIQDIbIUAwDwYA/iYXgGC4+z8AAAAAAAAAAAAAAACQePs/AwAAACMABgDQkfw/
/////2xB/D8MQvw/o1QJgCBB+z8DAAAAIwAGAAoAAABguPs/AAAAAHzMDkC/zA5A
AAAAADA2CEAgQfs/5H4JQAyk+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAP//P7MAAAAAAAAAAAAAAADobQmAgLj7PyAAAAABAAAA
//8/swAAAAAAAAAAAAAAAAAAAACguPs/AAAAAJRB/D8AAAAAkPn8P/hD/D8AAAAA
AAAAANC4+z8AAAAAAAAAAETd+z8AAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3Lj7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
tL77PxC9+z+svvs/
EL37P0C++z864g50DEL8P0i5+z+0vvs/BEL8PxkAAADdJJIJ93sj/bS++z8AAAAA
AAAAALC6+z9JRExFMQDclw0D03Hd/kEAAQAAAKy++z8AAAAAIQAGAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhqUA==
MDQIQDIbIUAwCgYA/iYXgNC9+z8AAAAADEL8P6NUCYAAvfs/AwAAACMABgAjAAYA
/////2xB/D8MQvw/o1QJgKC2/T8DAAAAIwAGAAAAAADQvfs/AAAAAAAAAAAAAAAA
AAAAADA2CECgtv0/5H4JQHyp+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAP//P7MAAAAAAAAAAAAAAADobQmA8L37PyAAAAABAAAA
//8/swAAAAAAAAAAAAAAAAAAAAAQvvs/AAAAAJRB/D8gAAAAkPn8P/xD/D8BAAAA
AAAAAEC++z8AAAAAAAAAAETd+z8AAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATL77PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
tJ/7P9Ct+z/Er/s/
0K37P2Cv+z8ZgEIA+EH8P/xC/T+0n/s/8EH8PwcAAAAIn/s/CJ/7P7Sf+z8An/s/
EgAAAMih+z90aVQATEH8P7x9+z/EffsAAAAAAMSv+z8AAAAAIQAGABIAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA
8000
AAAAAAAAAA==
MDQIQAxeCUAwCQYABdwYgJCu+z/cnvs/MK/7Pyif+z8AAAAAMJ/7PwAAAAAMXgmA
cK77PwAAAAAcAAAARN37P/hD/D/+AAAAAAAAABkAAAC4CRiAUK77P3w0CUCqNAlA
/////zA2CED4Q/w/5H4JQJya+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDj+P4AF/T/XYBiA0K77P/////8wr/s/
AAAAAP1/QgAAAAAAAAAAABwAAADgrvs/0Bu8PwAAAAAG/xiA4K77P9AbvD8AAAAA
O+sXgACv+z/I/vw/MK/7PzLrF4AQr/s/MLb9PwQAAAAcAAAA//////1/QgABAAAA
AAAAADCv+z8M/hhAAAAAAAAAAAAwr/s/DP4YQAAAAADEBf0/xAX9P8AF/T/ABf0/
AAAAAGCv+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbK/7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAA=
9EL9P+BA/T/sQv0/
4ED9P4BC/T8LgEIAvJ/7P/hB/D/0Qv0/8EH8PxMAAAApX3p2g0aC6vRC/T8AAAAA
BgAAAPA0/T9TaWdmb3gArlMwQLb8lqUAAAAAAOxC/T8AAAAAIQAGAAYAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIYY3A==
MDQIQAZsCUAwAQYAepEfgKBB/T8LgEIARN37PxAw/j8AAAAAAAAAAAAAAAAGbAmA
gEH9PwAAAAALgEIA9EL9PwEAAAD+AAAAIwAGABEAAACAQf0/AAAAACA8CUArPAlA
/////zA2CEABAAAA5H4JQLwt+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAP//P7MAAAAAAAAAAAAAAAAAAAAAwEH9P0wU/T9IFP0/
EDD+PwAAAAAAAAAAAAAAAAAAAACAQv0/AAAAAAAAAAAwNAhAYJEfQDAABQAAAAAA
gEL9PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
vC36PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIxC/T8AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
IMv7P8DJ+z8Yy/s/
wMn7P7DK+z8AAAAA5EH8P+RB/D8gy/s/3EH8Pw8AAABQwPs/UMD7PyDL+z9IwPs/
CgAAABzB+z9UbXIgU3ZjANE0uI7MOcoAAAAAABjL+z8AAAAAIQAGAAoAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+J0w==
MDQIQBl9CUAwAAYAAAAAAIDK+z8AAAAAAAAAAAAAAAAIRPw/AET8PwEAAAAZfQmA
YMr7PwAAAABE3fs/XEH8PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAADA2CEAAAAAA5H4JQOy1+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAOy1+D8AAAAAAAAAAAAAAAAAAAAAsMr7PwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAC8yvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAA=
eNj7P8DG/T9UyP0/
wMb9P/DH/T8AAAAAiDP9PySz+z942Ps/gEH8PxQAAAAopLwYyilfHnjY+z8AAAAA
BQAAAFi4/T9Tb2NrZXQgT3BlcmF0aW8AAQAAAFTI/T8AAAAAIQAGAAUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAO0+WQ==
MDQIQPC/AEAwAAYAIGcJgIDH/T8AAAAAIwAGACAABgDg8Ps/AwAAACMABgD//z+z
q6sAAOzc+z8jAAYAeNj7PwEAAAD+AAAAAAAAAAAAAAClpaWlpaWlpQAAAAAAAAAA
AAAAADA2CEABAAAA5H4JQCyz+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmeAmAkMf9P0Td+z8GAAAA
kl4OgLDH/T8BAAAA/EP8P3jY+z8BAAAA/gAAACAAAAAAAAAA0Mf9PwAAAAAAAAAA
+EP8P0Td+z9sQfw/cEL8PwAAAADwx/0/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Mf9PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAA=
gDP9P7Ax/T94M/0/
sDH9PxAz/T9c7Q37OHz7P4DY+z+AM/0/gEH8PxEAAACkSPs/pEj7P4Az/T+cSPs/
CAAAAHwn/T9Mb1JhX1RpbWVyX2NhbGwAAQAAAHgz/T8AAAAAIQAGAAgAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtTPw==
MDQIQPC/AEAwAAYAIGcJgHAy/T8AAAAAIwAGACAABgABAAAA/gAAAAAAQAD//z+z
q6sAAETd+z//////IAIGAAAQAAAAAAAA/////wAAAAClpaWlpaWlpQAAAAAAAAAA
AAAAADA2CEAAEAAA5H4JQEwe+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMABgADXgmAgDL9P8RI+z//////
gA8RgKAy/T94SPs/4DL9P0Td+z/4Q/w//gAAACMABgAAAAAA4DL9P1Sb/D8AAAAA
AAAAAL8FAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAADESPs/AAAAAMxI+z8AAAAA
AAAAABAz/T8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDP9PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
MHz7P7Cc+z84nvs/
sJz7P9Cd+z9nWZPQrLD7P4gz/T8wfPs/gEH8PwEAAAAEfPs/BHz7PzB8+z/8e/s/
GAAAADya+z9pcGMxAKf1lo7ViNqJydkAAQAAADie+z8AAAAAIQAGABgAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPNtNA==
MDQIQAxeCUAwAwYAHB4IgHCd+z/Ye/s/AAAAACR8+z8AAAAA2Hv7PwAAAAAMXgmA
UJ37PwEAAAD/////RN37P/hD/D/+AAAAIAMGABwAAAD//z+zAAAAACA8CUArPAlA
/////zA2CED4Q/w/5H4JQAyJ+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAADB8+z8BAAAA/gAAACMABgAAAAAAsJ37P8xA/D8AAAAA
AAAAAEwJAAD+AAAAIAMGAP////+wnfs/zED8P7hA/D8Advs/AAAAAAEAAAAAAAAA
AAAAANCd+z8AAAAAAAAAAKR3CEABAAAAAAAAAAAAAACAFAiAgH3+PwABAADoDQBA
AAAAAAAAAADcnfs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAA=
pLD7P5CW/T9ImP0/
kJb9P+CX/T/wsfs/BMz9Pzh8+z+ksPs/gEH8PwUAAAAghv0/IIb9P6Sw+z8Yhv0/
FAAAAEyM/T9ldmVudFRhc2sAAACgzwAAAAAAAEiY/T8AAAAAIQAGABQAAAAAAAAA
KDX7PwAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
MDQIQAxeCUAwBQYA0CUXgFCX/T/0hf0/kJf9P0CG/T8AAAAASIb9PwAAAAAMXgmA
MJf9PwAAAAD/////RN37P/hD/D/+AAAAAAAAABAAAAAgAQYAAQAAAHw0CUCqNAlA
AAAAADA2CED4Q/w/5H4JQByD+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACAFBgDAl/0/AAAAAAAAAAAAAAAAkJf9P0j5/D8AAAAA
AAAAAA4RAAD+AAAAAAAAAP////+Ql/0/SPn8PwAAAABAhv0/AAAAANiG/T8AAAAA
AAAAAOCX/T8AAAAAAAAAAAcAAAAKAACE////AAoAAPAB/z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAADsl/0/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAA=
/Mv9P1Dr/T9o7f0/
UOv9PwDt/T/DfmURTEP7P6yw+z/8y/0/gEH8Pw4AAABM1/s/TNf7P/zL/T9E1/s/
CwAAAGzN/T9JUlFzAACoUFiSe/T46g4AAQAAAGjt/T8AAAAAIQAGAAsAAAAAAAAA
AAAAAJzs/T8AAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsPPvA==
MDQIQAxeCUAwDAYAGD8PgBDs/T8g1/s/sOz9P2zX+z8AAAAAdNf7PwAAAAAMXgmA
8Ov9PwEAAAD/////RN37P/hD/D/+AAAAAAAAAAAAAAA82Po/AAAAAAAAAAAAAAAA
AAAAADA2CED4Q/w/5H4JQDzY+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADsywEA8PD7P+R+CUAsCA6AUOz9P1iS/D+w7P0/
AAAAALXPAQAAAAAAAAAAAP////9Q7P0/hJX8P7Ds/T8AAAAAAQAAACAAAAAgAAAA
AAAAAODs/T9Mkvw/AAAAAADt/T8AAAAAAAAAAAAAAAAAAAAATJL8PwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACw7P0/
ABwAACiU/D8olPw/AAAAADzY+j8AAAAAAAAAAAAAAAAolPw/CgAAAGxB/D/oQvw/
AAAAAADt/T8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAM7f0/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAA=
REP7P3BB+z88Q/s/
cEH7P9BC+z9xBRt0hHL7PwTM/T9EQ/s/gEH8PwIAAAB8Lvs/fC77P0RD+z90Lvs/
FwAAAEA1+z93aWZpAIuQQ5gQEkDVkaEAAAAAADxD+z8AAAAAIQAGABcAAAABAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkv/w==
MDQIQAxeCUAwDwYAASQXgDBC+z9QLvs/oEL7P5wu+z8AAAAApC77PwAAAAAMXgmA
EEL7PwAAAAD/////RN37P/hD/D/+AAAAAQAAABgAAAAlAAAAIEL7P/T8EkAi/RJA
BwAAADA2CED4Q/w/5H4JQAwu+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAALpsFYBAQvs/aqUBAOjh/D/1axWAcEL7P1Au+z+gQvs/
AAAAAPZ/QgC4Bfw/VAv8P/////8AAAAwjMb8PwxF+z8AAAAAAAAAALgF/D9UC/w/
AAAAAJBC+z+4Bfw/VAv8P/////98IBRA9QAAAABmAAAAAAAA0EL7PwAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAAAAAA6OX8PxoAAABICPw/
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3EL7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
fHL7P+Bw+z90cvs/
4HD7PxBy+z+fUdSYcHr7P0xD+z98cvs/gEH8PwMAAABMQPw/TED8P3xy+z9EQPw/
FgAAAHhm+z9lc3BfdGltZXIAV53CrMEAAAAAAHRy+z8AAAAAIQAGABYAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFjm4g==
MDQIQAxeCUAwAQYAZSQNgKBx+z8gQPw/AAAAAGxA/D8AAAAAIED8PwAAAAAMXgmA
gHH7PwAAAAD/////RN37P/hD/D/+AAAAIwAGAAAAAAAKAAAAAAAAAHw0CUCqNAlA
/////zA2CED4Q/w/5H4JQExd+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAABgAAAAAGAAAAwAAACMABgAAAAAA4HH7P3RA/D98QPw/
AAAAAPZ/QgBQLvs/IwAGAP/////gcfs/AAAAAHxA/D8BAAAAAAAAACRw9D8AAAAA
AAAAABBy+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHxA/D9WA8QD
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHL7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAA=
aHr7P+B4+z9gevs/
4Hj7PwB6+z/3l1fK1EX8P4Ry+z9oevs/gEH8PwEAAAA4dvs/OHb7P2h6+z8wdvs/
GAAAAGR2+z9pcGMwAD1B8gkd4jIFKHYAAAAAAGB6+z8AAAAAIQAGABgAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEQqA==
MDQIQAxeCUAwAQYAHB4IgKB5+z8Mdvs/AAAAAFh2+z8AAAAADHb7PwAAAAAMXgmA
gHn7PwAAAAD/////RN37P/hD/D/+AAAA/EL9PwAAAAAAAAAAAQAAAAAAAAAAAAAA
AAAAADA2CED4Q/w/5H4JQDxl+D8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAP//P7MAAAAAAAAAAAAAAAAAAAAA4Hn7P8hA/D8AAAAA
AAAAAASAQgD+AAAA/EL9P//////gefs/yED8P7hA/D8Advs/AAAAAAEAAAAAAAAA
AAAAAAB6+z8AAAAAAAAAAKR3CEAAAAAAAAAAAAAAAAD1EwiAIDz+P2hB/D+DaUA/
AAAAAAAAAAAMevs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
zEX8P0B7/T/shf0/
QHv9P4CF/T+DPkIAiEH8P3B6+z/MRfw/gEH8Pw4AAAAcPP4/HDz+P8xF/D8UPP4/
CwAAAPBV/T9NaWNyb1B5AAAAAAAAAAAAAQAAAOyF/T8AAAAAIQAGAAsAAAABAAAA
+DT7P9ST/D8AAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA==
MDQIQAxeCUAwBAYAxi4PgAB8/T/wO/4/AAAAADw8/j8AAAAAAAAAAAAAAAAMXgmA
4Hv9PwEAAAD/////RN37P/hD/D8LAAAAsK9APyAAAAD9////MDYIQHw0CUCqNAlA
/////zA2CED4Q/w/5H4JQLxw+j8AAAAAAAAAAAEAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAABwvD4AgfP0/SHz9PwoAAAB+/iCAQHz9P+DLmD/AR/w/
AAAAAAWAQgD+AAAAQAAAAP////9AfP0/AQAAAHDZmD//AAAAAP8AAAAA/wAAAAD/
Ct8PgHCA/T/gy5g/gAAAAAEAAACAAQAAcW1jdGVzdC5weQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHw0CUCqNAlA
7MuYP9ST/D8BAAAAuA8AAJgoEICQgP0/4MuYP3DZmD/8AAAAMOGYPwMAAAAPAAAA
2CoQgBCB/T8wzJg/4MuYPwEAAABiAAAARg4AABoAAADFJRCA0ID9P3w0CUCqNAlA
/////zA2CEABAAAA5H4JQLxw+j8AAAAAAAAAAAEAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAPDtQD8BAAAAYgAAAEYOAAA5XxCAMIH9P+zqQD8BAAAA
AAAAALBFQT/4/EA/Og8AAFDbD4BQgf0/7OpAPwEAAAAAAAAAUIL9PwQAAAACFQAA
AJsQgHCB/T/s6kA/AQAAAAAAAABQgv0/AAAAAAAAAAA7GBCAkIH9PwQAAAABi5Y/
AAAAAFCC/T+4gf0/IIL9P1DbD4Awgv0/KJT8PyiU/D/ggv0/AAAAADsYEICQgf0/
CAAAAFiC/T9Ugv0/TIL9PwAAAAAFAAAAAAAAAAEAAABQ2w+AMIL9P1DbD4Awgv0/
KJT8PyiU/D/ajRCAgAIAAAQAAABMgv0/AAAAAAUAAAAAAAAAMIL9P1iC/T9Ugv0/
AAAAAAAAAABgxUA/sK9AP0yC/T8w////AouWPwAAAAB92w+AoIL9PxCKlj8AAAAA
EIqWPwCLlj9Agv0/TIL9PyiU/D+QAEE/mABBP+zqQD/gy5g/AAAAAP///////wAA
lUAIgJCC/T+wgv0/AAAAAAAAAAAAAAAAEIqWPwAAAAAwgv0/AAAAAAAAAABwgv0/
RBQOgMCC/T8QipY/AAAAAAAAAAAAAAAAFQAAAAAAAAC7Fg6A4IL9PxCKlj8WAAAA
AAAAAAAAAAAAAAAAaIqWPzcBDoCAg/0//RhAPwAAAAAAAAAAEIP9P7sWDoDggv0/
5E78PwAAAAAWAAAAXAAAACIAAAD//wCADQAAAMRO/D8NAAAAQcdAPzcBDoCAg/0/
/RhAPwAAAADAEw6AyIqWP8CKlj9gg/0/gIP9P/0YQD8AAAAAxE78Py0AAAAAAAAA
FgAAAICD/T+SPkIAAAAAABYAAABcAAAAIgAAAP//AIAAAAAAwIP9P0D4+z8BAAAA
OAAAAC0AAACQiZY//v8AgAAAAADAg/0/AAAAAAEAAAA8PP4/AAAAAAEAAAAAAAAA
AAAAAICF/T8AAAAAAAAAAAEAAAClpaWlpaWlpaWlpaUAAAAAAAABpegAAADpAAAA
AQAAAAAEAAD4/x/QAAAAAP//////////paWlpaWlpaUBAAgAAAAAAKWlpaWlpaWl
paWlpaWlpaWlpaWlAAAAALxcQD+lpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaUwNAhAqPwNQDAABQAAAAAA
gIX9PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAADA8GQAAAAAA////////////////
/////72WflgAAAAAAAAAAAAAAAAA8B8AwIP9PwAAAAAAAAAAAAAAAAAAAAAAAAAA
fhdAPwAAKAAAAAAABhdAPwAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAIyF/T8AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
HLP7P7Cm/T9MqP0/
sKb9P+Cn/T9gs/s/gNj7P4hB/D8cs/s/gEH8PxQAAAAAAAAAAAAAAByz+z8AAAAA
BQAAAFCY/T9TbWFydENvbmZpZwAAAAAAAQAAAEyo/T8AAAAAIQAGAAUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAADUZPs/PGX7P6Rl+z8AAAAAAAAAAAEAAAAAAAAA
XYdAPwAAAADwMQlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAA==
MDQIQPC/AEAwAAYAIGcJgHCn/T8AAAAAIwAGACAABgDg8Ps/AwAAACMABgD//z+z
q6sAAOzc+z8jAAYAHLP7PwEAAAD+AAAAAAAAAAAAAAClpaWlpaWlpQAAAAAAAAAA
AAAAADA2CEABAAAA5H4JQByT+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmeAmAgKf9P0Td+z8FAAAA
u20OgKCn/T8BAAAA/EP8Pxyz+z8BAAAA/gAAACAAAAAAAAAAwKf9PwAAAAAAAAAA
+EP8P0Td+z9sQfw/cEL8PwAAAADgp/0/AAAAAAAAAAAcT/w/AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Kf9PwAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
================= CORE DUMP END =================

@salal-m
Copy link
Contributor
salal-m commented May 14, 2020

The decoded stack from this is:

==================== CURRENT THREAD STACK =====================
#0 lfs_pair_cmp (paira=0x10009, pairb=0x3ffc9310 <ftp_data+16>) at littlefs/lfs.c:240
#1 0x400f1de6 in lfs_dir_commit (lfs=0x10009, dir=0x3ffc9310 <ftp_data+16>, attrs=0x3ffdb700, attrcount=1073591904) at littlefs/lfs.c:1640
#2 0x400f2587 in lfs_file_sync (lfs=0x3ffc47c0 <sflash_vfs_flash+56>, file=0x3ffc9308 <ftp_data+8>) at littlefs/lfs.c:2595
#3 0x400f25d8 in lfs_file_close (lfs=0x3ffc47c0 <sflash_vfs_flash+56>, file=0x3ffc9308 <ftp_data+8>) at littlefs/lfs.c:2397
#4 0x400f370d in littlefs_close_common_helper (lfs=0x3ffc47c0 <sflash_vfs_flash+56>, fp=0x3ffc9308 <ftp_data+8>, cfg=0x3ffc935c <ftp_data+92>, timestamp_update_ptr=0x3ffc9368 <ftp_data+104>) at littlefs/vfs_littlefs.c:326
#5 0x400f52cd in f_closefile_helper (fp=0x3ffc9308 <ftp_data+8>) at ftp/ftp.c:416
#6 ftp_close_files () at ftp/ftp.c:1257
#7 0x400f61eb in ftp_run () at ftp/ftp.c:733
#8 0x400e021b in TASK_Servers (pvParameters=) at serverstask.c:105

The .elf file is:
application.elf.tar.gz

So, the crash is happening at another point now. For some reason I am not able to reproduce this one either on LOPY4. I transfer ~120 small files (average size 1KB) and then run the above code through REPL. It keeps printing the filenames without any issue. I even tried doing FTP transfer while this was running, still no crash. Does the crash happen immediately and is it consistent?

@robert-hh
Copy link
Contributor Author
robert-hh commented May 14, 2020

I will repeat the tests. And you have to do ftp file transfers while the listdir loop is running.

@robert-hh
Copy link
Contributor Author

One question about the changes: did you also change the definition of lfs_malloc in lfs_util.h? There m_malloc() was used, and lfs uses that for the allocation of a per-file cache buffer.

@salal-m
Copy link
Contributor
salal-m commented May 14, 2020

Yes. That has also been changed to use malloc().

@robert-hh
Copy link
Contributor Author

In the absence of your elf file, I had repeated the test with my local build, and could not produce the error again. Now it is running with your firmware again, and stable until now.
I hope the LoPy4 flash chip will last. But if it fails, I have spare flash chips here.

@robert-hh
Copy link
Contributor Author
robert-hh commented May 14, 2020

Looking at the decoded stack from teh core dump, things are definitely wrong. The code compares data, and both pointer should point to RAM addresses. But one of them does not, for whatever reason.
It is strange that the parameter lfs, which is just handed over between the calls in the stack, changes its value.

@salal-m
Copy link
Contributor
salal-m commented May 15, 2020

Were you able to reproduce this issue?
If the stack is corrupted and this happens while FTP and ilistdir() are running concurrently, then it could mean that one process is doing something to the other's stack somehow.
Could you also perform this test on your build and see if this happens there as well?

@robert-hh
Copy link
Contributor Author
robert-hh commented May 15, 2020

I tried quite a while with both firmware versions, but could not replicate it. That's kind of sad. But a core dump which happens repeatable but only once in a while is not much better.
I had seen that it happens while ftp is closing a file it had written to in the ftp thread. So likely a stack problem, maybe stack overflow.

@amotl
Copy link
Contributor
amotl commented May 15, 2020

Hi there,

I'm glad to see you are working on this topic and will be happy to review the current state against #418. We are using FTP intensively with our Squirrel builds [1] and have not seen any issues so far.

@salal-m and @peter-pycom: May I humbly ask which toolchain you are using to build the firmware images? I believe it is important to use 1.22.0-98 in order to mitigate random memory corruption issues on Espressif ESP32's rev.1 and rev.2 silicon [2,3]. Maybe you are already using rev.3?

With kind regards,
Andreas.

[1] https://community.hiveeyes.org/t/squirrel-firmware-for-pycom-esp32/2960
[2] https://community.hiveeyes.org/t/investigating-random-core-panics-on-pycom-esp32-devices/2480
[3] https://community.hiveeyes.org/t/random-memory-corruption-faults-on-esp32-wrover-rev-1-and-rev-2-when-running-in-dual-core-mode/2515


P.S.: When already working on this, please also take #413 into consideration. While this won't raise any core dumps, it would be cool to see it integrated within the upcoming release candidate as well.

@robert-hh
Copy link
Contributor Author

I should not that all kudos on this topic go to @amotl, who was the first to mention that and his work for fixing it. After we talked about it, I started to look for the malloc() uses and changed it at two places, ftp.c and lfs_util.h. @amotl male later his PR #418 with a more extensive list of potentially affected places.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants
0