Add gdbinit (a lot of Python logic copypasted from Python wiki IIRC) - dotfiles - leot's dotfiles
 (HTM) hg clone https://bitbucket.org/iamleot/dotfiles
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) changeset 034275712dce7edc31a321a590f1586db62525c9
 (DIR) parent 788f83769620e26da024754d8f9a47ce62341d50
 (HTM) Author: Leonardo Taccari <iamleot@gmail.com>
       Date:   Thu, 13 Jun 2019 22:31:15 
       
       Add gdbinit (a lot of Python logic copypasted from Python wiki IIRC)
       
       Diffstat:
        gdbinit |  164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        1 files changed, 164 insertions(+), 0 deletions(-)
       ---
       diff -r 788f83769620 -r 034275712dce gdbinit
       --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
       +++ b/gdbinit   Thu Jun 13 22:31:15 2019 +0200
       @@ -0,0 +1,164 @@
       +set print pretty on
       +
       +# 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)
       +#
       +# NOTE: If you have gdb 7 or later, it supports debugging of Python directly
       +# with embedded macros that you may find superior to what is in here.
       +# See Tools/gdb/libpython.py and http://bugs.python.org/issue8032.
       +
       +# 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
       +    # side effect of calling _PyObject_Dump is to dump the object's
       +    # info - assigning just prevents gdb from printing the
       +    # NULL return value
       +    set $_unused_void = _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_code->co_nlocals
       +       if f->f_localsplus + $_i != 0
       +           set $_names = co->co_varnames
       +           set $_name = _PyUnicode_AsString(PyTuple_GetItem($_names, $_i))
       +           printf "%s:\n", $_name
       +            pyo f->f_localsplus[$_i]
       +       end
       +        set $_i = $_i + 1
       +    end
       +end
       +
       +# A rewrite of the Python interpreter's line number calculator in GDB's
       +# command language
       +define lineno
       +    set $__continue = 1
       +    set $__co = f->f_code
       +    set $__lasti = f->f_lasti
       +    set $__sz = ((PyVarObject *)$__co->co_lnotab)->ob_size/2
       +    set $__p = (unsigned char *)((PyBytesObject *)$__co->co_lnotab)->ob_sval
       +    set $__li = $__co->co_firstlineno
       +    set $__ad = 0
       +    while ($__sz-1 >= 0 && $__continue)
       +      set $__sz = $__sz - 1
       +      set $__ad = $__ad + *$__p
       +      set $__p = $__p + 1
       +      if ($__ad > $__lasti)
       +       set $__continue = 0
       +      else
       +        set $__li = $__li + *$__p
       +        set $__p = $__p + 1
       +      end
       +    end
       +    printf "%d", $__li
       +end
       +
       +# print the current frame - verbose
       +define pyframev
       +    pyframe
       +    pylocals
       +end
       +
       +define pyframe
       +    set $__fn = _PyUnicode_AsString(co->co_filename)
       +    set $__n = _PyUnicode_AsString(co->co_name)
       +    printf "%s (", $__fn
       +    lineno
       +    printf "): %s\n", $__n
       +### Uncomment these lines when using from within Emacs/XEmacs so it will
       +### automatically track/display the current Python source line
       +#    printf "%c%c%s:", 032, 032, $__fn
       +#    lineno
       +#    printf ":1\n"
       +end
       +
       +### Use these at your own risk.  It appears that a bug in gdb causes it
       +### to crash in certain circumstances.
       +
       +#define up
       +#    up-silently 1
       +#    printframe
       +#end
       +
       +#define down
       +#    down-silently 1
       +#    printframe
       +#end
       +
       +define printframe
       +    if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
       +       pyframe
       +    else
       +        frame
       +    end
       +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 PyEval_EvalFrameEx().
       +
       +# Note: The name of the main interpreter function and the function which
       +# follow it has changed over time.  This version of pystack works with this
       +# version of Python.  If you try using it with older or newer versions of
       +# the interpreter you may will have to change the functions you compare with
       +# $pc.
       +
       +# print the entire Python call stack
       +define pystack
       +    while $pc < Py_Main || $pc > Py_GetArgcArgv
       +        if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
       +           pyframe
       +        end
       +        up-silently 1
       +    end
       +    select-frame 0
       +end
       +
       +# print the entire Python call stack - verbose mode
       +define pystackv
       +    while $pc < Py_Main || $pc > Py_GetArgcArgv
       +        if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx
       +           pyframev
       +        end
       +        up-silently 1
       +    end
       +    select-frame 0
       +end
       +
       +# generally useful macro to print a Unicode string
       +def pu
       +  set $uni = $arg0
       +  set $i = 0
       +  while (*$uni && $i++<100)
       +    if (*$uni < 0x80)
       +      print *(char*)$uni++
       +    else
       +      print /x *(short*)$uni++
       +    end
       +  end
       +end