]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
include local variables when dumping Python stack trace
authorSkip Montanaro <skip@pobox.com>
Fri, 2 Apr 2004 14:51:13 +0000 (14:51 +0000)
committerSkip Montanaro <skip@pobox.com>
Fri, 2 Apr 2004 14:51:13 +0000 (14:51 +0000)
Misc/gdbinit

index 4790adae54cfc78f82d4e1f084ade0d5a1cf94f9..05b2612d3204548a15f88c2167aac5dc1d585ad9 100644 (file)
@@ -26,15 +26,6 @@ define pyg
 print _PyGC_Dump($arg0)
 end
 
-# If you are in an eval_frame() function, calling pyframe with no
-# arguments will print the filename, function name, and line number.
-# It assumes that f is the name of the current frame.
-define pyframe
-x/s ((PyStringObject*)f->f_code->co_filename)->ob_sval
-x/s ((PyStringObject*)f->f_code->co_name)->ob_sval
-p f->f_lineno
-end
-
 # Here's a somewhat fragile way to print the entire Python stack from gdb.
 # It's fragile because the tests for the value of $pc depend on the layout
 # of specific functions in the C source code.
@@ -46,6 +37,42 @@ end
 # tests succeeds as long as it's not true.  In a similar fashion the if
 # statement tests to see if we are in eval_frame().
 
+# print the local variables of the current frame
+define pylocals
+    set $_i = 0
+    while $_i < f->f_nlocals
+       if f->f_localsplus + $_i != 0
+           set $_names = co->co_varnames
+           set $_name = PyString_AsString(PyTuple_GetItem($_names, $_i))
+           printf "%s:\n", $_name
+           # side effect of calling _PyObject_Dump is to dump the object's
+           # info - assigning just prevents gdb from printing the
+           # NULL return value
+           set $_val = _PyObject_Dump(f->f_localsplus[$_i])
+       end
+        set $_i = $_i + 1
+    end
+end
+
+# print the current frame
+define pyframe
+    set $__fn = PyString_AsString(co->co_filename)
+    set $__n = PyString_AsString(co->co_name)
+    printf "%s (%d): %s\n",  $__fn, f->f_lineno, $__n
+    pylocals
+end
+
+# print the entire Python call stack
+define pystack
+    while $pc < Py_Main || $pc > Py_GetArgcArgv
+        if $pc > eval_frame && $pc < PyEval_EvalCodeEx
+           pyframe
+        end
+        up-silently 1
+    end
+    select-frame 0
+end
+
 define pystack
     while $pc < Py_Main || $pc > Py_GetArgcArgv
         if $pc > eval_frame && $pc < PyEval_EvalCodeEx