I'm trying to get file, function and line number to display in a message. I found a technique here (https://forum.micropython.org/viewtopic.php?t=7811), and tried to adapt it. It seemed to be working for a bit, but then somehow it stopped. The idea was to force an exception, which should dump a stack trace, then rummage through that. But for some reason, it is only showing the current function:
Traceback (most recent call last): File "lib/logging.py", line 46, in log ValueError: foo 'Traceback (most recent call last):\n File "lib/logging.py", line 46, in log\nValueError: foo\n' line= Traceback (most recent call last): line= File "lib/logging.py", line 46, in log INFO:Traceback (most recent call last)::ShowError (2000-1-1 0:0:14): error='WiFi connected'
Here's my code (borrowed in part from https://github.com/m5stack/M5Stack_MicroPython/blob/master/MicroPython_BUILD/components/micropython/esp32/modules/logging.py). Note that I also tried the seek(0) readline() thing from the example I'm copying, but it doesn't matter. In fact, just throwing a straight
sys.print_exception(err) and letting it print out still doesn't show the stack.
def log(self, level, msg, *args): if level >= (self.level or _level): redirect = io.StringIO() try: raise ValueError('foo') except ValueError as err: sys.print_exception(err, redirect) print('%r' % redirect.getvalue()) caller = 'unknown' for new_line in redirect.getvalue().splitlines(): print('line=',new_line) if 'logging.py' in new_line: break caller = new_line if caller != 'unknown': caller = caller_re.sub('[\\1:\\2](\\3)', caller) _stream.write("%s:%s:" % (self._level_str(level), caller)) if not args: print(msg, file=_stream) else: print(msg % args, file=_stream)
I know from other code that I have that
sys.print_exception(err) normally prints the stack, so I'm a bit flummoxed!
Any ideas where the stack trace went?