summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/gdbinit23
-rw-r--r--Modules/main.c3
-rw-r--r--Python/ceval.c4
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,