mirror of https://github.com/python/cpython.git
75 lines
2.4 KiB
Plaintext
75 lines
2.4 KiB
Plaintext
# -*- 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
|
|
|
|
# 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
|
|
|
|
# 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().
|
|
|
|
# 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
|