diff options
-rw-r--r-- | Misc/gdbinit | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/Misc/gdbinit b/Misc/gdbinit index 4790ada..05b2612 100644 --- a/Misc/gdbinit +++ b/Misc/gdbinit @@ -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 |