mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-27 21:16:50 +03:00
Print stack on exception and soft WDT reset
This commit is contained in:
parent
66b480ab06
commit
703a9f3ef8
@ -129,9 +129,6 @@ void user_init(void) {
|
|||||||
uart_div_modify(0, UART_CLK_FREQ / (74480));
|
uart_div_modify(0, UART_CLK_FREQ / (74480));
|
||||||
|
|
||||||
system_rtc_mem_read(0, &resetInfo, sizeof(struct rst_info));
|
system_rtc_mem_read(0, &resetInfo, sizeof(struct rst_info));
|
||||||
if(resetInfo.reason == REASON_WDT_RST || resetInfo.reason == REASON_EXCEPTION_RST) {
|
|
||||||
os_printf("Last Reset:\n - flag=%d\n - Fatal exception (%d):\n - epc1=0x%08x,epc2=0x%08x,epc3=0x%08x,excvaddr=0x%08x,depc=0x%08x\n", resetInfo.reason, resetInfo.exccause, resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc);
|
|
||||||
}
|
|
||||||
struct rst_info info = { 0 };
|
struct rst_info info = { 0 };
|
||||||
system_rtc_mem_write(0, &info, sizeof(struct rst_info));
|
system_rtc_mem_write(0, &info, sizeof(struct rst_info));
|
||||||
|
|
||||||
|
130
cores/esp8266/core_esp8266_postmortem.c
Normal file
130
cores/esp8266/core_esp8266_postmortem.c
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
postmortem.c - output of debug info on sketch crash
|
||||||
|
Copyright (c) 2015 Ivan Grokhotkov. All rights reserved.
|
||||||
|
This file is part of the esp8266 core for Arduino environment.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "ets_sys.h"
|
||||||
|
#include "user_interface.h"
|
||||||
|
#include "esp8266_peri.h"
|
||||||
|
#include "cont.h"
|
||||||
|
|
||||||
|
extern void __real_system_restart_local();
|
||||||
|
extern cont_t g_cont;
|
||||||
|
|
||||||
|
static void uart0_write_char_d(char c);
|
||||||
|
static void print_stack(uint32_t start, uint32_t end);
|
||||||
|
static void print_pcs(uint32_t start, uint32_t end);
|
||||||
|
|
||||||
|
void __wrap_system_restart_local() {
|
||||||
|
register uint32_t sp asm("a1");
|
||||||
|
|
||||||
|
struct rst_info rst_info = {0};
|
||||||
|
system_rtc_mem_read(0, &rst_info, sizeof(rst_info));
|
||||||
|
if (rst_info.reason != REASON_SOFT_WDT_RST &&
|
||||||
|
rst_info.reason != REASON_EXCEPTION_RST &&
|
||||||
|
rst_info.reason != REASON_WDT_RST)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ets_install_putc1(&uart0_write_char_d);
|
||||||
|
|
||||||
|
if (rst_info.reason == REASON_EXCEPTION_RST) {
|
||||||
|
ets_printf("\nException (%d):\nepc1=0x%08x epc2=0x%08x epc3=0x%08x excvaddr=0x%08x depc=0x%08x\n",
|
||||||
|
rst_info.exccause, rst_info.epc1, rst_info.epc2, rst_info.epc3, rst_info.excvaddr, rst_info.depc);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t cont_stack_start = (uint32_t) &(g_cont.stack);
|
||||||
|
uint32_t cont_stack_end = (uint32_t) g_cont.stack_end;
|
||||||
|
uint32_t stack_end;
|
||||||
|
|
||||||
|
// amount of stack taken by interrupt or exception handler
|
||||||
|
// and everything up to __wrap_system_restart_local
|
||||||
|
// (determined empirically, might break)
|
||||||
|
uint32_t offset = 0;
|
||||||
|
if (rst_info.reason == REASON_SOFT_WDT_RST) {
|
||||||
|
offset = 0x1b0;
|
||||||
|
}
|
||||||
|
else if (rst_info.reason == REASON_EXCEPTION_RST) {
|
||||||
|
offset = 0x1a0;
|
||||||
|
}
|
||||||
|
else if (rst_info.reason == REASON_WDT_RST) {
|
||||||
|
offset = 0x10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sp > cont_stack_start && sp < cont_stack_end) {
|
||||||
|
ets_printf("\nctx: cont \n");
|
||||||
|
stack_end = cont_stack_end;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ets_printf("\nctx: sys \n");
|
||||||
|
stack_end = 0x3fffffb0;
|
||||||
|
// it's actually 0x3ffffff0, but the stuff below ets_run
|
||||||
|
// is likely not really relevant to the crash
|
||||||
|
}
|
||||||
|
|
||||||
|
ets_printf("sp: %08x end: %08x offset: %04x\n", sp, stack_end, offset);
|
||||||
|
|
||||||
|
// print_pcs(sp + offset, stack_end);
|
||||||
|
print_stack(sp + offset, stack_end);
|
||||||
|
delayMicroseconds(10000);
|
||||||
|
__real_system_restart_local();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void print_stack(uint32_t start, uint32_t end) {
|
||||||
|
ets_printf("\n>>>stack>>>\n");
|
||||||
|
for (uint32_t pos = start; pos < end; pos += 0x10) {
|
||||||
|
uint32_t* values = (uint32_t*)(pos);
|
||||||
|
|
||||||
|
// rough indicator: stack frames usually have SP saved as the second word
|
||||||
|
bool looksLikeStackFrame = (values[2] == pos + 0x10);
|
||||||
|
|
||||||
|
ets_printf("%08x: %08x %08x %08x %08x %c\n",
|
||||||
|
pos, values[0], values[1], values[2], values[3], (looksLikeStackFrame)?'<':' ');
|
||||||
|
}
|
||||||
|
ets_printf("<<<stack<<<\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_pcs(uint32_t start, uint32_t end) {
|
||||||
|
uint32_t n = 0;
|
||||||
|
ets_printf("\n>>>pc>>>\n");
|
||||||
|
for (uint32_t pos = start; pos < end; pos += 16, ++n) {
|
||||||
|
uint32_t* sf = (uint32_t*) pos;
|
||||||
|
|
||||||
|
uint32_t pc_ret = sf[3];
|
||||||
|
uint32_t sp_ret = sf[2];
|
||||||
|
if (pc_ret < 0x40000000 || pc_ret > 0x40f00000 || sp_ret != pos + 16)
|
||||||
|
continue;
|
||||||
|
ets_printf("%08x\n", pc_ret);
|
||||||
|
}
|
||||||
|
ets_printf("<<<pc<<<\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void uart0_write_char_d(char c) {
|
||||||
|
while (((USS(0) >> USTXC) & 0xff) >= 0x7e) { }
|
||||||
|
|
||||||
|
if (c == '\n') {
|
||||||
|
USF(0) = '\r';
|
||||||
|
}
|
||||||
|
USF(0) = c;
|
||||||
|
}
|
@ -21,7 +21,7 @@ compiler.c.flags=-c -Os -g -Wpointer-arith -Wno-implicit-function-declaration -W
|
|||||||
compiler.S.cmd=xtensa-lx106-elf-gcc
|
compiler.S.cmd=xtensa-lx106-elf-gcc
|
||||||
compiler.S.flags=-c -g -x assembler-with-cpp -MMD
|
compiler.S.flags=-c -g -x assembler-with-cpp -MMD
|
||||||
|
|
||||||
compiler.c.elf.flags=-g -Os -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-T{build.flash_ld}"
|
compiler.c.elf.flags=-g -Os -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-T{build.flash_ld}" -Wl,-wrap,system_restart_local
|
||||||
compiler.c.elf.cmd=xtensa-lx106-elf-gcc
|
compiler.c.elf.cmd=xtensa-lx106-elf-gcc
|
||||||
compiler.c.elf.libs=-lm -lgcc -lhal -lphy -lnet80211 -llwip -lwpa -lmain -lpp -lsmartconfig
|
compiler.c.elf.libs=-lm -lgcc -lhal -lphy -lnet80211 -llwip -lwpa -lmain -lpp -lsmartconfig
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user