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