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_EvalFrame().
|
---|
119 |
|
---|
120 | # print the entire Python call stack
|
---|
121 | define pystack
|
---|
122 | while $pc < Py_Main || $pc > Py_GetArgcArgv
|
---|
123 | if $pc > PyEval_EvalFrame && $pc < PyEval_EvalCodeEx
|
---|
124 | pyframe
|
---|
125 | end
|
---|
126 | up-silently 1
|
---|
127 | end
|
---|
128 | select-frame 0
|
---|
129 | end
|
---|
130 |
|
---|
131 | # print the entire Python call stack - verbose mode
|
---|
132 | define pystackv
|
---|
133 | while $pc < Py_Main || $pc > Py_GetArgcArgv
|
---|
134 | if $pc > PyEval_EvalFrame && $pc < PyEval_EvalCodeEx
|
---|
135 | pyframev
|
---|
136 | end
|
---|
137 | up-silently 1
|
---|
138 | end
|
---|
139 | select-frame 0
|
---|
140 | end
|
---|
141 |
|
---|
142 | # generally useful macro to print a Unicode string
|
---|
143 | def pu
|
---|
144 | set $uni = $arg0
|
---|
145 | set $i = 0
|
---|
146 | while (*$uni && $i++<100)
|
---|
147 | if (*$uni < 0x80)
|
---|
148 | print *(char*)$uni++
|
---|
149 | else
|
---|
150 | print /x *(short*)$uni++
|
---|
151 | end
|
---|
152 | end
|
---|
153 | end
|
---|