Python Script to decode ESP8266 Exceptions.
GPL 3.0
If you are getting error ERROR: Parser not complete!
while running original decoder - this is maybe because in your stack trace lines are in another order (I don't know why). So to fix it you can use original project and swap lines, or use this fork, which expects "wrong" lines order.
Right order (works with original project)
Exception (3):
epc1=0x40210070 epc2=0x00000000 epc3=0x00000000 excvaddr=0x4024361b depc=0x00000000
ctx: cont
sp: 3fff0900 end: 3fff0af0 offset: 01a0
>>>stack>>>
3fff0aa0: 4024361b 00000000 3ffef4b0 402062e0
3fff0ab0: 3fffdad0 3ffee7a0 3ffef4b0 4020146b
3fff0ac0: 00000000 00000000 00000001 40207c7d
3fff0ad0: 3fffdad0 00000000 3ffef5a0 40207d0c
3fff0ae0: feefeffe feefeffe 3ffe8510 401004b5
<<<stack<<<
Wrong order (works with this project)
Exception (3):
epc1=0x40210070 epc2=0x00000000 epc3=0x00000000 excvaddr=0x4024361b depc=0x00000000
>>>stack>>>
ctx: cont
sp: 3fff0900 end: 3fff0af0 offset: 01a0
3fff0aa0: 4024361b 00000000 3ffef4b0 402062e0
3fff0ab0: 3fffdad0 3ffee7a0 3ffef4b0 4020146b
3fff0ac0: 00000000 00000000 00000001 40207c7d
3fff0ad0: 3fffdad0 00000000 3ffef5a0 40207d0c
3fff0ae0: feefeffe feefeffe 3ffe8510 401004b5
<<<stack<<<
usage: decoder.py [-h] [-p {ESP8266,ESP32}] [-t TOOL] -e ELF [-f] file
decode ESP Stacktraces.
positional arguments:
file The file to read the exception data from ('-' for
STDIN)
optional arguments:
-h, --help show this help message and exit
-p {ESP8266,ESP32}, --platform {ESP8266,ESP32}
The platform to decode from
-t TOOL, --tool TOOL Path to the xtensa toolchain
-e ELF, --elf ELF path to elf file
-f, --full Print full stack dump
The tool is the path to your xtensa toolchain. If you use PlatformIO it should be ~/.platformio/packages/toolchain-xtensa
for the ESP8266 and ~/.platformio/packages/toolchain-xtensa32
for the ESP32.
The elf path is the path to your built elf binary. On PlatformIO it is located at <project-dir>/.pioenvs/<environment-name>/firmware.elf
.
- python 3 or 2.7
- The xtensa toolchain for your ESP
Given you have the following stacktrace from the ESP:
Exception (3):
epc1=0x4022ca68 epc2=0x00000000 epc3=0x00000000 excvaddr=0x4026b579 depc=0x00000000
ctx: cont
sp: 3fff2250 end: 3fff2590 offset: 01a0
>>>stack>>>
3fff23f0: 00000000 00000000 3fff5a50 4020d548
3fff2400: 00000003 3fff13c4 3fff5a50 4020ea3c
3fff2410: 3fff4bb4 00000066 00000000 40229598
3fff2420: 3fff46dc 00000010 00000000 40229598
3fff2430: 3fff0000 00000001 00000000 4020560d
3fff2440: 3fff4c44 00000280 4020d04c 40229524
3fff2450: 3fff4bb4 3fff24ec 4020d014 40229598
3fff2460: 3fff5314 3fff24c0 00000000 40202b20
3fff2470: 3fff5a50 00000001 00000000 40203b67
3fff2480: 00010101 3f010101 3fff5a2c 40228d4c
3fff2490: 3fff2432 00000001 3fff24c0 402013d2
3fff24a0: 3fff59ec 3fff5a2c 00000000 3fff13c4
3fff24b0: 3fff5a50 3fff24ec 00000000 4020ebfd
3fff24c0: 3ffe98b0 00000000 000003e8 00008c1c
3fff24d0: 00000000 00000000 3fff6174 0000000f
3fff24e0: 00000000 3fff24ec 0000000a 3ffe9838
3fff24f0: 3fff59d0 3fff5d64 00000800 40201864
3fff2500: 3fff13c4 3fff2de0 3fff2de0 4022b498
3fff2510: 3fff13c4 3fff2de0 00000000 4022b1de
3fff2520: 3fff4bb4 feefeffe 4022a150 4022a4ec
3fff2530: feefeffe feefeffe feefeffe feefeffe
3fff2540: feefeffe feefeffe feefeffe feefeffe
3fff2550: feefeffe feefeffe feefeffe feefeffe
3fff2560: feefeffe feefeffe feefeffe 3fff1564
3fff2570: 3fffdad0 00000000 3fff155c 40202cfc
3fff2580: feefeffe feefeffe 3fff1570 40204eb0
<<<stack<<<
You can dump it in a file called myStackTrace.txt
and run the decode.py
script:
$ <...>/decoder.py -e .pioenvs/d1_mini/firmware.elf myStackTrace.txt1
This prints the processed stacktrace:
Exception: 3 (LoadStoreError: Processor internal physical address or data error during load or store)
epc1: 0x4022ca68: strcmp at /Users/igrokhotkov/e/newlib-xtensa/xtensa-lx106-elf/newlib/libc/machine/xtensa/../../../../.././newlib/libc/machine/xtensa/strcmp.S:470
epc2: 0x00000000
epc3: 0x00000000
excvaddr: 0x4026b579: chip_v6_unset_chanfreq at ??:?
depc: 0x00000000
ctx: cont
sp: 0x3fff2250
end: 0x3fff2590
offset: 0x000001a0
stack:
0x4020d548: bool ArduinoJson::JsonObject::containsKey<__FlashStringHelper>(__FlashStringHelper const*) const at /home/jan/devel/MQTT433gateway/.piolibdeps/ArduinoJson_ID64/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp:56
0x4020ea3c: Settings::applyJson(ArduinoJson::JsonObject&) at /home/jan/devel/MQTT433gateway/.piolibdeps/ArduinoJson_ID64/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp:56
0x40229598: String::length() const at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/WString.h:79
\-> inlined by: operator() at /home/jan/devel/MQTT433gateway/lib/Settings/Settings.cpp:67
\-> inlined by: _M_invoke at /home/jan/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/functional:2057
0x40229598: String::length() const at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/WString.h:79
\-> inlined by: operator() at /home/jan/devel/MQTT433gateway/lib/Settings/Settings.cpp:67
\-> inlined by: _M_invoke at /home/jan/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/functional:2057
0x4020560d: spiffs_hydro_read at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/spiffs/spiffs_hydrogen.c:1122
\-> inlined by: SPIFFS_read at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/spiffs/spiffs_hydrogen.c:427
0x4020d04c: std::_Function_base::_Base_manager<std::function<bool (unsigned short const&)> notZero<unsigned short>()::{lambda(unsigned short const&)#1}>::_M_manager(std::_Any_data&, std::_Function_base::_Base_manager<std::function<bool (unsigned short const&)> notZero<unsi
6206
gned short>()::{lambda(unsigned short const&)#1}> const&, std::_Manager_operation) at /home/jan/devel/MQTT433gateway/.piolibdeps/ArduinoJson_ID64/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp:56
0x40229524: std::function<bool (unsigned short const&)> notZero<unsigned short>()::{lambda(unsigned short const&)#1}::operator()(unsigned short const&) const at /home/jan/devel/MQTT433gateway/lib/Settings/Settings.cpp:72
\-> inlined by: std::_Function_handler<bool (unsigned short const&), std::function<bool (unsigned short const&)> notZero<unsigned short>()::{lambda(unsigned short const&)#1}>::_M_invoke(std::_Any_data const&, unsigned short const&) at /home/jan/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/functional:2057
0x4020d014: _M_manager at /home/jan/devel/MQTT433gateway/.piolibdeps/ArduinoJson_ID64/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp:56
0x40229598: String::length() const at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/WString.h:79
\-> inlined by: operator() at /home/jan/devel/MQTT433gateway/lib/Settings/Settings.cpp:67
\-> inlined by: _M_invoke at /home/jan/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/functional:2057
0x40202b20: operator delete(void*) at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/abi.cpp:57
0x40203b67: std::_Sp_counted_deleter<SPIFFSFileImpl*, std::__shared_ptr<SPIFFSFileImpl, (__gnu_cxx::_Lock_policy)0>::_Deleter<std::allocator<SPIFFSFileImpl> >, std::allocator<SPIFFSFileImpl>, (__gnu_cxx::_Lock_policy)0>::_M_destroy() at /home/jan/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/shared_ptr_base.h:357
0x40228d4c: std::__shared_count<(__gnu_cxx::_Lock_policy)0>::~__shared_count() at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/libraries/ESP8266mDNS/ESP8266mDNS.cpp:396
0x402013d2: fs::File::close() at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/FS.cpp:251
0x4020ebfd: Settings::load() at /home/jan/devel/MQTT433gateway/.piolibdeps/ArduinoJson_ID64/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp:56
0x40201864: Print::println() at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/Print.cpp:187
0x4022b498: std::_Function_handler<void (Settings const&), void (*)(Settings const&)>::_M_invoke(std::_Any_data const&, Settings const&) at /home/jan/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/functional:2069
0x4022b1de: setup at /home/jan/devel/MQTT433gateway/src/MQTT433gateway.cpp:207
0x4022a150: _M_manager at /home/jan/devel/MQTT433gateway/.piolibdeps/ArduinoJson_ID64/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp:56
0x4022a4ec: _M_invoke at /home/jan/devel/MQTT433gateway/.piolibdeps/ArduinoJson_ID64/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp:56
0x40202cfc: loop_wrapper at /home/jan/.platformio/packages/framework-arduinoespressif8266@src-31d658a59f41540201fc3726a1394910/cores/esp8266/core_esp8266_main.cpp:57
0x40204eb0: cont_norm at cont.o:?
This is heavily inspired by EspExceptionDecoder.