Debugging fatal exceptions with cal_dex.
Posted: Tue Apr 21, 2015 2:11 pm
Moin,
I wanted to have more information in case of cpu exceptions.
The result is the c level module "cal_dex" to debug exceptions.
The cpu exception handlers are tried to be wrapped and
additional information is printed to serial.
The following exception is the result from adding the following 2 lines
to "void nodemcu_init(void)" in user_main.c:
This produces the following exception output:
1. Exception code 29: Illegal write access
2. epc1: 4023f8c2
The program counter when exception happened.
Execute:
xtensa-lx106-elf-addr2line -f -e app/.output/eagle/debug/image/eagle.app.v6.out 4023f8c2
nodemcu_init
??:?
3. excvaddr: 00001020
Someone wrote (exception 29) to address "00001020"
The code is here
https://github.com/cal101/nodemcu-firmw ... ev-cal-dex
You can use the whole branch which is just nodemcu-firmware, branch dev@6eb5b9c874cb1248ec77b57e946ffbf1cb431d08 (20.4.)
with cal_dex 0.1 added and startup message changed accordingly.
Integrating into your own builds is easy:
1. Add
to your build.
2. Add the following 3 lines to your Makefile
I suggest also to switch the baud rate of your nodemcu firmware to 115200 because
early output is written at 115200 and that means less switching.
Note that really early messages will be printed at 74880 baud.
Please let me know what you think about it!
Carsten
I wanted to have more information in case of cpu exceptions.
The result is the c level module "cal_dex" to debug exceptions.
The cpu exception handlers are tried to be wrapped and
additional information is printed to serial.
The following exception is the result from adding the following 2 lines
to "void nodemcu_init(void)" in user_main.c:
Code: Select all
// NODE_DBG("Flash sec num: 0x%x\n", flash_get_sec_num());
task_init();
system_os_post(USER_TASK_PRIO_0,SIG_LUA,'s');
+ // provoke Exception(29) writing the value 0xdeadbeaf to memory location 0x1020
+ *((int*)(0x1020)) = 0xdeadbeaf;
}
This produces the following exception output:
Code: Select all
cal_dex 0.1, dump 0.1
Fatal Exception: 001d (29), sp 3ffff720
SDK Version: 0.9.5
Fingerprint: 1/xh=4023fb8c,t=0000-7d1c,d=8000-8b48,b=ca80-5360,ro=8b50-ca80
epc1: 4023f8c2 exccause: 0000001d excvaddr: 00001020 depc: 00000000
ps : 00000030 sar : 0000000b unk1 : 00000000
a0 : 4023f8bc a1 : 3ffff820 a2 : 00001020 a3 : deadbeaf
a4 : c0200000 a5 : 3fffdab0 a6 : c0000000 a7 : 3fffdb20
a8 : 3fff58e0 a9 : 00000000 a10: 00000018 a11: 00000001
a12: 00080000 a13: 3ffecaa6 a14: 00000000 a15: 00000000
Stack (3ffff800)
3ffff7e0 00000480 00000000 3fffc718 402401b4 3fff5900 3fff58d0 4023f7d5 00080000
3ffff800 00000000 00000073 00000016 40100905 4023f8bc 3ffecaa6 00080000 4023f8af
3ffff820 8772000a 8d6c0a1b 2a106b73 efb59fcc d224ed2a 3c53381c e5db8fa3 8b45d9c1
3ffff840 72a005bd d9f8672f 91922415 d74dfbcf 09371733 4fd43d77 bc909457 bea74191
3ffff860 02e0906f 8a8722e5 900aa04e 80b6c98c be011f95 f75f530d 102bb6e3 bfe22af7
3ffff880 fe02e578 36bd19e3 931137ae b584d88c e6081f9d b058f2b2 fac9a074 f10981d8
3ffff8a0 0061f580 537d058c f5948567 179aec11 e2b2b36a 35f067b6 ad61578d 121e80b3
3ffff8c0 414db20d da021081 ae2c98d1 8b366efb f9c6bad4 7ff68b1e 89e889d7 9c9e04b2
3ffff8e0 e374d251 525dcc6a 6d378304 7300f335 22622da5 2cbaaa64 2c2b22fa 4f7ace44
3ffff900 c2c4be7c 7cb7780c 18a5cfb9 674efe6a 63211ff7 2e57b5aa 2bf88b5e 81ebad6e
3ffff920 0a24a65a 9b402545 83e268cf 8cd84bd7 654ace64 fe3abe60 2c8bc0c6 15b5a5d7
3ffff940 4c44e16f f5e9510b b8d31267 445e01c7 ce42d021 48edd298 c125c630 96c36f0d
3ffff960 a4f9df23 cf7d7a1c ea3a75ca e791ca53 717013eb 52a5d9be 5f83c23d f55d354d
3ffff980 03f255f8 312746f8 4ed7d74c 605d76dd 00000000 00000000 0000001f 40002e35
3ffff9a0 4000050c a0889c20 00000000 00004ec3 00009c20 00004ec3 00000000 ffffffff
3ffff9c0 40002ef1 00855c79 00000013 00000000 50444e10 00000000 3ffffa52 40221926
ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x40100000, len 32028, room 16
tail 12
chksum 0xf9
ho 0 tail 12 room 4
load 0x3ffe8000, len 2888, room 12
tail 12
chksum 0x6a
ho 0 tail 12 room 4
load 0x3ffe8b50, len 16176, room 12
tail 4
chksum 0x08
csum 0x08
r,
1. Exception code 29: Illegal write access
2. epc1: 4023f8c2
The program counter when exception happened.
Execute:
xtensa-lx106-elf-addr2line -f -e app/.output/eagle/debug/image/eagle.app.v6.out 4023f8c2
nodemcu_init
??:?
3. excvaddr: 00001020
Someone wrote (exception 29) to address "00001020"
The code is here
https://github.com/cal101/nodemcu-firmw ... ev-cal-dex
You can use the whole branch which is just nodemcu-firmware, branch dev@6eb5b9c874cb1248ec77b57e946ffbf1cb431d08 (20.4.)
with cal_dex 0.1 added and startup message changed accordingly.
Integrating into your own builds is easy:
1. Add
Code: Select all
app/platform/cal_dex.c
to your build.
2. Add the following 3 lines to your Makefile
Code: Select all
@@ -116,6 +116,9 @@ CCFLAGS += \
-mtext-section-literals
# -Wall
+# for cal_dex - exception debugging
+LDFLAGS += -Wl,--undefined=_xtos_set_exception_handler -Wl,--wrap=_xtos_set_exception_handler
+
CFLAGS = $(CCFLAGS) $(DEFINES) $(EXTRA_CCFLAGS) $(INCLUDES)
I suggest also to switch the baud rate of your nodemcu firmware to 115200 because
early output is written at 115200 and that means less switching.
Code: Select all
app/user/user_main.c:
@@ -133,7 +135,8 @@ void user_init(void)
#ifdef DEVELOP_VERSION
uart_init(BIT_RATE_74880, BIT_RATE_74880);
#else
- uart_init(BIT_RATE_9600, BIT_RATE_9600);
+ uart_init(BIT_RATE_115200, BIT_RATE_115200);
+ //uart_init(BIT_RATE_9600, BIT_RATE_9600);
#endif
// uart_init(BIT_RATE_115200, BIT_RATE_115200);
Note that really early messages will be printed at 74880 baud.
Please let me know what you think about it!
Carsten