XEmacs 21.2.11
[chise/xemacs-chise.git-] / src / gdbinit
1 # -*- ksh -*-
2 # Copyright (C) 1998 Free Software Foundation, Inc.
3
4 # This file is part of XEmacs.
5
6 # XEmacs is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License as published by the
8 # Free Software Foundation; either version 2, or (at your option) any
9 # later version.
10
11 # XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 # for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with XEmacs; see the file COPYING.  If not, write to
18 # the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 # Boston, MA 02111-1307, USA.
20
21 # Author: Martin Buchholz
22
23 # Some useful commands for debugging emacs with gdb 4.16 or better.
24 # Install this as your .gdbinit file in your home directory,
25 # or source this file from your .gdbinit
26 # Configure xemacs with --debug, and compile with -g.
27 #
28 # See also the question of the XEmacs FAQ, titled
29 # "How to Debug an XEmacs problem with a debugger".
30 #
31 # This can be used to debug XEmacs no matter how the following are
32 # specified:
33
34 # USE_UNION_TYPE
35 # USE_MINIMAL_TAGBITS
36 # USE_INDEXED_LRECORD_IMPLEMENTATION
37 # LRECORD_(SYMBOL|STRING|VECTOR)
38
39 # (the above all have configure equivalents)
40
41 # Some functions defined here require a running process, but most
42 # don't.  Considerable effort has been expended to this end.
43
44 # See the dbg_ C support code in src/alloc.c that allows the functions
45 # defined in this file to work correctly.
46
47 set print union off
48 set print pretty off
49
50 define decode_object
51   set $obj = (unsigned long) $arg0
52   if dbg_USE_MINIMAL_TAGBITS
53     if $obj & 1
54     # It's an int
55       set $val = $obj >> 1
56       set $type = dbg_Lisp_Type_Int
57     else
58       set $type = $obj & dbg_typemask
59       if $type == dbg_Lisp_Type_Char
60         set $val = ($obj & dbg_valmask) >> dbg_gctypebits
61       else
62         # It's a record pointer
63         set $val = $obj
64       end
65     end
66   else
67     # not dbg_USE_MINIMAL_TAGBITS
68     set $val = $obj & dbg_valmask
69     set $type = ($obj & dbg_typemask) >> (dbg_valbits + 1)
70   end
71
72   if $type == dbg_Lisp_Type_Record
73     set $lheader = (struct lrecord_header *) $val
74     if dbg_USE_INDEXED_LRECORD_IMPLEMENTATION
75       set $imp = lrecord_implementations_table[$lheader->type]
76     else
77       set $imp = $lheader->implementation
78     end
79   else
80     set $imp = -1
81   end
82 end
83
84 document decode_object
85 Usage: decode_object lisp_object
86 Extract implementation information from a Lisp Object.
87 Defines variables $val, $type and $imp.
88 end
89
90 define xint
91 decode_object $arg0
92 print ((long) $val)
93 end
94
95 define xtype
96   decode_object $arg0
97   if $type == dbg_Lisp_Type_Int
98     echo int\n
99   else
100   if $type == dbg_Lisp_Type_Char
101     echo char\n
102   else
103   if $type == dbg_Lisp_Type_Symbol
104     echo symbol\n
105   else
106   if $type == dbg_Lisp_Type_String
107     echo string\n
108   else
109   if $type == dbg_Lisp_Type_Vector
110     echo vector\n
111   else
112   if $type == dbg_Lisp_Type_Cons
113     echo cons\n
114   else
115     printf "record type: %s\n", $imp->name
116   # barf
117   end
118   end
119   end
120   end
121   end
122   end
123 end
124
125 define lisp-shadows
126   run -batch -vanilla -f list-load-path-shadows
127 end
128
129 document lisp-shadows
130 Usage: lisp-shadows
131 Run xemacs to check for lisp shadows
132 end
133
134 define environment-to-run-temacs
135   unset env EMACSLOADPATH
136   set env EMACSBOOTSTRAPLOADPATH   = ../lisp/:..
137   set env EMACSBOOTSTRAPMODULEPATH = ../lisp/
138 end
139
140 define run-temacs
141   environment-to-run-temacs
142   run -batch -l ../lisp/loadup.el run-temacs -q
143 end
144
145 document run-temacs
146 Usage: run-temacs
147 Run temacs interactively, like xemacs.
148 Use this with debugging tools (like purify) that cannot deal with dumping,
149 or when temacs builds successfully, but xemacs does not.
150 end
151
152 define update-elc
153   environment-to-run-temacs
154   run -batch -l ../lisp/update-elc.el
155 end
156
157 document update-elc
158 Usage: update-elc
159 Run the core lisp byte compilation part of the build procedure.
160 Use when debugging temacs, not xemacs!
161 Use this when temacs builds successfully, but xemacs does not.
162 end
163
164 define dump-temacs
165   environment-to-run-temacs
166   run -batch -l ../lisp/loadup.el dump
167 end
168
169 document dump-temacs
170 Usage: dump-temacs
171 Run the dumping part of the build procedure.
172 Use when debugging temacs, not xemacs!
173 Use this when temacs builds successfully, but xemacs does not.
174 end
175
176 # if you use Purify, do this:
177 # export PURIFYOPTIONS='-pointer-mask=0x0fffffff'
178
179 define ldp
180   printf "%s", "Lisp => "
181   call debug_print($arg0)
182 end
183
184 document ldp
185 Usage: ldp lisp_object
186 Print a Lisp Object value using the Lisp printer.
187 Requires a running xemacs process.
188 end
189
190 define lbt
191 call debug_backtrace()
192 end
193
194 document lbt
195 Usage: lbt
196 Print the current Lisp stack trace.
197 Requires a running xemacs process.
198 end
199
200 define wtype
201 print $arg0->core.widget_class->core_class.class_name
202 end
203
204 define xtname
205 print XrmQuarkToString(((Object)($arg0))->object.xrm_name)
206 end
207
208 # GDB's command language makes you want to ...
209
210 define pstruct
211   set $xstruct = (struct $arg0 *) $val
212   print $xstruct
213   print *$xstruct
214 end
215
216 define pobj
217   decode_object $arg0
218   if $type == dbg_Lisp_Type_Int
219     printf "Integer: %d\n", $val
220   else
221   if $type == dbg_Lisp_Type_Char
222     if $val < 128
223       printf "Char: %c\n", $val
224     else
225       printf "Char: %d\n", $val
226     end
227   else
228   if $type == dbg_Lisp_Type_String || $imp == lrecord_string
229     pstruct Lisp_String
230   else
231   if $type == dbg_Lisp_Type_Cons   || $imp == lrecord_cons
232     pstruct Lisp_Cons
233   else
234   if $type == dbg_Lisp_Type_Symbol || $imp == lrecord_symbol
235     pstruct Lisp_Symbol
236     printf "Symbol name: %s\n", $xstruct->name->data
237   else
238   if $type == dbg_Lisp_Type_Vector || $imp == lrecord_vector
239     pstruct Lisp_Vector
240     printf "Vector of length %d\n", $xstruct->size
241     #print *($xstruct->data) @ $xstruct->size
242   else
243   if $imp == lrecord_bit_vector
244     pstruct Lisp_Bit_Vector
245   else
246   if $imp == lrecord_buffer
247     pstruct buffer
248   else
249   if $imp == lrecord_char_table
250     pstruct Lisp_Char_Table
251   else
252   if $imp == lrecord_char_table_entry
253     pstruct Lisp_Char_Table_Entry
254   else
255   if $imp == lrecord_charset
256     pstruct Lisp_Charset
257   else
258   if $imp == lrecord_coding_system
259     pstruct Lisp_Coding_System
260   else
261   if $imp == lrecord_color_instance
262     pstruct Lisp_Color_Instance
263   else
264   if $imp == lrecord_command_builder
265     pstruct command_builder
266   else
267   if $imp == lrecord_compiled_function
268     pstruct Lisp_Compiled_Function
269   else
270   if $imp == lrecord_console
271     pstruct console
272   else
273   if $imp == lrecord_database
274     pstruct Lisp_Database
275   else
276   if $imp == lrecord_device
277     pstruct device
278   else
279   if $imp == lrecord_event
280     pstruct Lisp_Event
281   else
282   if $imp == lrecord_extent
283     pstruct extent
284   else
285   if $imp == lrecord_extent_auxiliary
286     pstruct extent_auxiliary
287   else
288   if $imp == lrecord_extent_info
289     pstruct extent_info
290   else
291   if $imp == lrecord_face
292     pstruct Lisp_Face
293   else
294   if $imp == lrecord_float
295     pstruct Lisp_Float
296   else
297   if $imp == lrecord_font_instance
298     pstruct Lisp_Font_Instance
299   else
300   if $imp == lrecord_frame
301     pstruct frame
302   else
303   if $imp == lrecord_glyph
304     pstruct Lisp_Glyph
305   else
306   if $imp == lrecord_hash_table
307     pstruct Lisp_Hash_Table
308   else
309   if $imp == lrecord_image_instance
310     pstruct Lisp_Image_Instance
311   else
312   if $imp == lrecord_keymap
313     pstruct Lisp_Keymap
314   else
315   if $imp == lrecord_lcrecord_list
316     pstruct lcrecord_list
317   else
318   if $imp == lrecord_lstream
319     pstruct lstream
320   else
321   if $imp == lrecord_marker
322     pstruct Lisp_Marker
323   else
324   if $imp == lrecord_opaque
325     pstruct Lisp_Opaque
326   else
327   if $imp == lrecord_opaque_list
328     pstruct Lisp_Opaque_List
329   else
330   if $imp == lrecord_popup_data
331     pstruct popup_data
332   else
333   if $imp == lrecord_process
334     pstruct Lisp_Process
335   else
336   if $imp == lrecord_range_table
337     pstruct Lisp_Range_Table
338   else
339   if $imp == lrecord_specifier
340     pstruct Lisp_Specifier
341   else
342   if $imp == lrecord_subr
343     pstruct Lisp_Subr
344   else
345   if $imp == lrecord_symbol_value_buffer_local
346     pstruct symbol_value_buffer_local
347   else
348   if $imp == lrecord_symbol_value_forward
349     pstruct symbol_value_forward
350   else
351   if $imp == lrecord_symbol_value_lisp_magic
352     pstruct symbol_value_lisp_magic
353   else
354   if $imp == lrecord_symbol_value_varalias
355     pstruct symbol_value_varalias
356   else
357   if $imp == lrecord_toolbar_button
358     pstruct toolbar_button
359   else
360   if $imp == lrecord_tooltalk_message
361     pstruct Lisp_Tooltalk_Message
362   else
363   if $imp == lrecord_tooltalk_pattern
364     pstruct Lisp_Tooltalk_Pattern
365   else
366   if $imp == lrecord_weak_list
367     pstruct weak_list
368   else
369   if $imp == lrecord_window
370     pstruct window
371   else
372   if $imp == lrecord_window_configuration
373     pstruct window_config
374   else
375     echo Unknown Lisp Object type\n
376     print $arg0
377   # Barf, gag, retch
378   end
379   end
380   end
381   end
382   end
383   end
384   end
385   end
386   end
387   end
388   end
389   end
390   end
391   end
392   end
393   # Repeat after me... gdb sux, gdb sux, gdb sux...
394   end
395   end
396   end
397   end
398   end
399   end
400   end
401   end
402   end
403   end
404   end
405   end
406   end
407   end
408   end
409   end
410   end
411   end
412   # Are we having fun yet??
413   end
414   end
415   end
416   end
417   end
418   end
419   end
420   end
421   end
422   end
423   end
424   end
425   end
426   end
427   end
428   end
429   end
430 end
431
432 document pobj
433 Usage: pobj lisp_object
434 Print the internal C structure of a underlying Lisp Object.
435 end