🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    Trying to get file, function, line number

    Micropython
    1
    1
    2.0k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      dclaar
      last edited by

      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?

      1 Reply Last reply Reply Quote 0
      • First post
        Last post