split functionality into pystack and pystackv commands.  The former will
work with core dumps because it avoids calling any Python API routines.  The
latter prints all the local variable values as well as the stack frames but
won't work with core dumps because it relies on _PyObject_Dump to print
variables.
diff --git a/Misc/gdbinit b/Misc/gdbinit
index 145cc3a..51370e2 100644
--- a/Misc/gdbinit
+++ b/Misc/gdbinit
@@ -43,14 +43,18 @@
     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
+# print the current frame - verbose
+define pyframev
+    pyframe
     pylocals
 end
 
+define pyframe
+    set $__fn = (char *)((PyStringObject *)co->co_filename)->ob_sval
+    set $__n = (char *)((PyStringObject *)co->co_name)->ob_sval
+    printf "%s (%d): %s\n",  $__fn, f->f_lineno, $__n
+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.
@@ -72,3 +76,14 @@
     end
     select-frame 0
 end
+
+# print the entire Python call stack - verbose mode
+define pystackv
+    while $pc < Py_Main || $pc > Py_GetArgcArgv
+        if $pc > PyEval_EvalFrame && $pc < PyEval_EvalCodeEx
+	    pyframev
+        end
+        up-silently 1
+    end
+    select-frame 0
+end