8000 Fixed running on Windows. Added ESP32 backtrace parsing. · me21/EspArduinoExceptionDecoder@16859ce · GitHub
[go: up one dir, main page]

Skip to content

Commit 16859ce

Browse files
committed
Fixed running on Windows. Added ESP32 backtrace parsing.
Signed-off-by: Alexandr Zarubkin <me21@yandex.ru>
1 parent db768cb commit 16859ce

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

decoder.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"ESP32": "esp32"
5555
}
5656

57+
BACKTRACE_REGEX = re.compile(r"(?:\s+(0x40[0-2](?:\d|[a-f]|[A-F]){5}):0x(?:\d|[a-f]|[A-F]){8})\b")
5758
EXCEPTION_REGEX = re.compile("^Exception \\((?P<exc>[0-9]*)\\):$")
5859
COUNTER_REGEX = re.compile('^epc1=(?P<epc1>0x[0-9a-f]+) epc2=(?P<epc2>0x[0-9a-f]+) epc3=(?P<epc3>0x[0-9a-f]+) '
5960
'excvaddr=(?P<excvaddr>0x[0-9a-f]+) depc=(?P<depc>0x[0-9a-f]+)$')
@@ -85,6 +86,12 @@ def __init__(self):
8586

8687
self.stack = []
8788

89+
def _parse_backtrace(self, line):
90+
if line.startswith('Backtrace:'):
91+
self.stack = [StackLine(offset=0, content=(addr,)) for addr in BACKTRACE_REGEX.findall(line)]
92+
return None
93+
return self._parse_backtrace
94+
8895
def _parse_exception(self, line):
8996
match = EXCEPTION_REGEX.match(line)
9097
if match is not None:
@@ -134,10 +141,13 @@ def _parse_stack_line(self, line):
134141
return self._parse_stack_line
135142
return None
136143

137-
def parse_file(self, file, stack_only=False):
138-
func = self._parse_exception
139-
if stack_only:
140-
func = self._parse_stack_begin
144+
def parse_file(self, file, platform, stack_only=False):
145+
if platform == 'ESP32':
146+
func = self._parse_backtrace
147+
else:
148+
func = self._parse_exception
149+
if stack_only:
150+
func = self._parse_stack_begin
141151

142152
for line in file:
143153
func = func(line.strip())
@@ -237,8 +247,8 @@ def print_stack(lines, resolver):
237247
print(out)
238248

239249

240-
def print_result(parser, resolver, full=True, stack_only=False):
241-
if not stack_only:
250+
def print_result(parser, resolver, platform, full=True, stack_only=False):
251+
if platform == 'ESP8266' and not stack_only:
242252
print('Exception: {} ({})'.format(parser.exception, EXCEPTIONS[parser.exception]))
243253

244254
print("")
@@ -291,6 +301,8 @@ def parse_args():
291301

292302
addr2line = os.path.join(os.path.abspath(os.path.expanduser(args.tool)),
293303
"bin/xtensa-" + PLATFORMS[args.platform] + "-elf-addr2line")
304+
if os.name == 'nt':
305+
addr2line += '.exe'
294306
if not os.path.exists(addr2line):
295307
print("ERROR: addr2line not found (" + addr2line + ")")
296308

@@ -301,7 +313,7 @@ def parse_args():
301313
parser = ExceptionDataParser()
302314
resolver = AddressResolver(addr2line, elf_file)
303315

304-
parser.parse_file(file, args.stack_only)
316+
parser.parse_file(file, args.platform, args.stack_only)
305317
resolver.fill(parser)
306318

307-
print_result(parser, resolver, args.full, args.stack_only)
319+
print_result(parser, resolver, args.platform, args.full, args.stack_only)

0 commit comments

Comments
 (0)
0