include local variables when dumping Python stack trace
diff --git a/Misc/gdbinit b/Misc/gdbinit
index 4790ada..05b2612 100644
--- a/Misc/gdbinit
+++ b/Misc/gdbinit
@@ -26,15 +26,6 @@
 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 @@
 # 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