print python stack trace without exception being raised
Asked Answered
R

2

104

Something is happening with one of my class's instance variables. I want to make the variable a property, and whenever it is accessed I want to print out the stack trace of all the code leading up to that point, so I can see where it's being messed with. How do I print out the stack trace when no exception has been raised? I know if there is an exception I can do something like traceback.format_tb(sys.exc_info()[2]).

Also what might be useful is to print only the last 3-4 levels, since the first few are probably not going to be that interesting.

Romano answered 13/10, 2010 at 15:20 Comment(0)
A
142

traceback.print_stack():

>>> def f():
...   def g():
...     traceback.print_stack()
...   g()
...
>>> f()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in f
  File "<stdin>", line 3, in g

Edit: You can also use extract_stack, take a slice (e.g. stack[5:] for exclude the first 5 levels) and use format_list to get a print-ready stacktrace ('\n'.join(traceback.format_list(...)))

Ackerley answered 13/10, 2010 at 15:28 Comment(1)
Thanks for the edit, it helped me with this answer for a very general full_stack() function!Suprematism
M
29

Instead of printing to stdout, if you need a string to pass to a logger you can use:

''.join(traceback.format_stack())

Note, that traceback.format_stack() returns the stacktrace as a formatted list of strings, so you can slice it anyway you want. To get the last few elements of the stacktrace you could do:

''.join(traceback.format_stack()[-N:])

Where N is the number of levels you are interested in.

Myer answered 24/4, 2018 at 19:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.