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 |