1 # If you use the GNU debugger gdb to debug the Python C runtime, you 2 # might find some of the following commands useful. Copy this to your 3 # ~/.gdbinit file and it'll get loaded into gdb automatically when you 4 # start it up. Then, at the gdb prompt you can do things like: 5 # 6 # (gdb) pyo apyobjectptr 7 # <module 'foobar' (built-in)> 8 # refcounts: 1 9 # address : 84a7a2c 10 # $1 = void 11 # (gdb) 12 # 13 # NOTE: If you have gdb 7 or later, it supports debugging of Python directly 14 # with embedded macros that you may find superior to what is in here. 15 # See Tools/gdb/libpython.py and http://bugs.python.org/issue8032. 16 17 # Prints a representation of the object to stderr, along with the 18 # number of reference counts it current has and the hex address the 19 # object is allocated at. The argument must be a PyObject* 20 define pyo 21 # side effect of calling _PyObject_Dump is to dump the object's 22 # info - assigning just prevents gdb from printing the 23 # NULL return value 24 set $_unused_void = _PyObject_Dump($arg0) 25 end 26 27 # Prints a representation of the object to stderr, along with the 28 # number of reference counts it current has and the hex address the 29 # object is allocated at. The argument must be a PyGC_Head* 30 define pyg 31 print _PyGC_Dump($arg0) 32 end 33 34 # print the local variables of the current frame 35 define pylocals 36 set $_i = 0 37 while $_i < f->f_code->co_nlocals 38 if f->f_localsplus + $_i != 0 39 set $_names = co->co_varnames 40 set $_name = PyString_AsString(PyTuple_GetItem($_names, $_i)) 41 printf "%s:\n", $_name 42 pyo f->f_localsplus[$_i] 43 end 44 set $_i = $_i + 1 45 end 46 end 47 48 # A rewrite of the Python interpreter's line number calculator in GDB's 49 # command language 50 define lineno 51 set $__continue = 1 52 set $__co = f->f_code 53 set $__lasti = f->f_lasti 54 set $__sz = ((PyStringObject *)$__co->co_lnotab)->ob_size/2 55 set $__p = (unsigned char *)((PyStringObject *)$__co->co_lnotab)->ob_sval 56 set $__li = $__co->co_firstlineno 57 set $__ad = 0 58 while ($__sz-1 >= 0 && $__continue) 59 set $__sz = $__sz - 1 60 set $__ad = $__ad + *$__p 61 set $__p = $__p + 1 62 if ($__ad > $__lasti) 63 set $__continue = 0 64 else 65 set $__li = $__li + *$__p 66 set $__p = $__p + 1 67 end 68 end 69 printf "%d", $__li 70 end 71 72 # print the current frame - verbose 73 define pyframev 74 pyframe 75 pylocals 76 end 77 78 define pyframe 79 set $__fn = (char *)((PyStringObject *)co->co_filename)->ob_sval 80 set $__n = (char *)((PyStringObject *)co->co_name)->ob_sval 81 printf "%s (", $__fn 82 lineno 83 printf "): %s\n", $__n 84 ### Uncomment these lines when using from within Emacs/XEmacs so it will 85 ### automatically track/display the current Python source line 86 # printf "%c%c%s:", 032, 032, $__fn 87 # lineno 88 # printf ":1\n" 89 end 90 91 ### Use these at your own risk. It appears that a bug in gdb causes it 92 ### to crash in certain circumstances. 93 94 #define up 95 # up-silently 1 96 # printframe 97 #end 98 99 #define down 100 # down-silently 1 101 # printframe 102 #end 103 104 define printframe 105 if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx 106 pyframe 107 else 108 frame 109 end 110 end 111 112 # Here's a somewhat fragile way to print the entire Python stack from gdb. 113 # It's fragile because the tests for the value of $pc depend on the layout 114 # of specific functions in the C source code. 115 116 # Explanation of while and if tests: We want to pop up the stack until we 117 # land in Py_Main (this is probably an incorrect assumption in an embedded 118 # interpreter, but the test can be extended by an interested party). If 119 # Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while 120 # tests succeeds as long as it's not true. In a similar fashion the if 121 # statement tests to see if we are in PyEval_EvalFrameEx(). 122 123 # Note: The name of the main interpreter function and the function which 124 # follow it has changed over time. This version of pystack works with this 125 # version of Python. If you try using it with older or newer versions of 126 # the interpreter you may will have to change the functions you compare with 127 # $pc. 128 129 # print the entire Python call stack 130 define pystack 131 while $pc < Py_Main || $pc > Py_GetArgcArgv 132 if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx 133 pyframe 134 end 135 up-silently 1 136 end 137 select-frame 0 138 end 139 140 # print the entire Python call stack - verbose mode 141 define pystackv 142 while $pc < Py_Main || $pc > Py_GetArgcArgv 143 if $pc > PyEval_EvalFrameEx && $pc < PyEval_EvalCodeEx 144 pyframev 145 end 146 up-silently 1 147 end 148 select-frame 0 149 end 150 151 # generally useful macro to print a Unicode string 152 def pu 153 set $uni = $arg0 154 set $i = 0 155 while (*$uni && $i++<100) 156 if (*$uni < 0x80) 157 print *(char*)$uni++ 158 else 159 print /x *(short*)$uni++ 160 end 161 end 162 end 163