On 7/16/2015 7:45 AM, Chris Angelico wrote:
On Thu, Jul 16, 2015 at 5:31 PM, Antoon Pardon
<antoon.par...@rece.vub.ac.be> wrote:


Traceback are not the only or even the most useful
tool for debugging code. The current stack trace
doesn't even contain the value's of the variables
on the stack. So in case of Terry Reedy's example
that stack trace would IMO have been next to useless.

Actually, they do contain all of that (at least, they do in Py3 - not
sure about Py2 as I haven't checked). You can poke around with the
locals at every point on the stack:

def f(x):
     if x < 10: g(x+10)
     return 5

def g(x):
     if x % 3: h(x + 2)
     return 7

def h(x):
     return 1/x

try:
     x = -12
     print(f(x))
except ZeroDivisionError as e:
     tb = e.__traceback__
     while tb:
         fr = tb.tb_frame
         print("In function %s (%s:%d), x = %r" % (
             fr.f_code.co_name,
             fr.f_code.co_filename,
             fr.f_lineno,
             fr.f_locals["x"],
         ))
         tb = tb.tb_next


It's all there. And it's immensely helpful.

One of the features of Idle is Debug => Stack Viewer, which, when invoked immediately after an exception, displays a tree widget with a node for each stack frame in the traceback. Running your code without the extra try: except: stuff, so a traceback is displayed, I easily see that x is -12, -2, and 0 in f, g, and h. I suspect that this feature is not well known and is underused.

--
Terry Jan Reedy

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to