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