diff options
-rw-r--r-- | Misc/gdbinit | 23 | ||||
-rw-r--r-- | Modules/main.c | 3 | ||||
-rw-r--r-- | Python/ceval.c | 4 |
3 files changed, 30 insertions, 0 deletions
diff --git a/Misc/gdbinit b/Misc/gdbinit index 05f6a91..4790ada 100644 --- a/Misc/gdbinit +++ b/Misc/gdbinit @@ -34,3 +34,26 @@ 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. + +# Explanation of while and if tests: We want to pop up the stack until we +# land in Py_Main (this is probably an incorrect assumption in an embedded +# interpreter, but the test can be extended by an interested party). If +# Py_Main <= $pc <= Py_GetArgcArv is true $pc is in Py_Main(), so the while +# 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(). + +define pystack + while $pc < Py_Main || $pc > Py_GetArgcArgv + if $pc > eval_frame && $pc < PyEval_EvalCodeEx + set $__fn = PyString_AsString(co->co_filename) + set $__n = PyString_AsString(co->co_name) + printf "%s (%d): %s\n", $__fn, f->f_lineno, $__n + end + up-silently 1 + end + select-frame 0 +end diff --git a/Modules/main.c b/Modules/main.c index 68a82c7..fc5773c 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -452,6 +452,9 @@ Py_Main(int argc, char **argv) return sts; } +/* this is gonna seem *real weird*, but if you put some other code between + Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the + while statement in Misc/gdbinit:ppystack */ /* Make the *original* argc/argv available to other modules. This is rare, but it is needed by the secureware extension. */ diff --git a/Python/ceval.c b/Python/ceval.c index c6fb0bf..3371844 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2445,6 +2445,10 @@ fast_yield: return retval; } +/* this is gonna seem *real weird*, but if you put some other code between + eval_frame() and PyEval_EvalCodeEx() you will need to adjust the test in + the if statement in Misc/gdbinit:ppystack */ + PyObject * PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals, PyObject **args, int argcount, PyObject **kws, int kwcount, |