63
|
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
|