mirror of
https://github.com/python/cpython.git
synced 2026-03-06 13:00:50 +00:00
and add flag comments to ceval.c and main.c alerting people to the coupling between pystack and the layout of those files.
59 lines
2.2 KiB
Text
59 lines
2.2 KiB
Text
# -*- ksh -*-
|
|
#
|
|
# If you use the GNU debugger gdb to debug the Python C runtime, you
|
|
# might find some of the following commands useful. Copy this to your
|
|
# ~/.gdbinit file and it'll get loaded into gdb automatically when you
|
|
# start it up. Then, at the gdb prompt you can do things like:
|
|
#
|
|
# (gdb) pyo apyobjectptr
|
|
# <module 'foobar' (built-in)>
|
|
# refcounts: 1
|
|
# address : 84a7a2c
|
|
# $1 = void
|
|
# (gdb)
|
|
|
|
# Prints a representation of the object to stderr, along with the
|
|
# number of reference counts it current has and the hex address the
|
|
# object is allocated at. The argument must be a PyObject*
|
|
define pyo
|
|
print _PyObject_Dump($arg0)
|
|
end
|
|
|
|
# Prints a representation of the object to stderr, along with the
|
|
# number of reference counts it current has and the hex address the
|
|
# object is allocated at. The argument must be a PyGC_Head*
|
|
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.
|
|
|
|
# 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
|