Skip to content

oxan/EspArduinoExceptionDecoder

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 

Repository files navigation

EspArduinoExceptionDecoder

Python script to decode ESP8266 stacktraces and exceptions.

Dependencies:

  • Python 3
  • The Xtensa toolchain for your ESP

Usage:

usage: decoder.py [-h] [-p {ESP8266,ESP32}] [-t TOOLCHAIN] -e ELF [-f] file Decode ESP stacktraces. positional arguments: file file to read exception data from ('-' for stdin) optional arguments: -h, --help show this help message and exit -p {ESP8266,ESP32}, --platform {ESP8266,ESP32} platform to decode for -t TOOLCHAIN, --toolchain TOOLCHAIN path to the Xtensa toolchain -e ELF, --elf ELF path to ELF file -f, --full print full stack dump 

The toolchain 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.

Example:

Given you have the following stacktrace from the ESP:

Exception (3): epc1=0x4022ca68 epc2=0x00000000 epc3=0x00000000 excvaddr=0x4026b579 depc=0x00000000 >>>stack>>> ctx: cont sp: 3fff2250 end: 3fff2590 offset: 01a0 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 decoder.py script:

$ <...>/decoder.py -e .pioenvs/d1_mini/firmware.elf myStackTrace.txt 

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<unsigned 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:? 

License

GPL-3.0

Acknowledgement

This is heavily inspired by EspExceptionDecoder.

About

Python script to decode ESP stacktraces and exceptions.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%