Skip to content

Commit

Permalink
Add pystack definition to Misc/gdbinit with some explanation of its b…
Browse files Browse the repository at this point in the history
…ehavior

and add flag comments to ceval.c and main.c alerting people to the coupling
between pystack and the layout of those files.
  • Loading branch information
Skip Montanaro committed Mar 1, 2004
1 parent 87f1013 commit 786ea6b
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
23 changes: 23 additions & 0 deletions Misc/gdbinit
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 3 additions & 0 deletions Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
4 changes: 4 additions & 0 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -2445,6 +2445,10 @@ eval_frame(PyFrameObject *f)
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,
Expand Down

0 comments on commit 786ea6b

Please sign in to comment.