2 # Copyright (C) 1998 Free Software Foundation, Inc.
4 # This file is part of XEmacs.
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
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
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.
21 # Author: Martin Buchholz
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.
28 # See also the question of the XEmacs FAQ, titled
29 # "How to Debug an XEmacs problem with a debugger".
31 # This can be used to debug XEmacs no matter how the following are
36 # USE_INDEXED_LRECORD_IMPLEMENTATION
37 # LRECORD_(SYMBOL|STRING|VECTOR)
39 # (the above all have configure equivalents)
41 # Some functions defined here require a running process, but most
42 # don't. Considerable effort has been expended to this end.
44 # See the dbg_ C support code in src/alloc.c that allows the functions
45 # defined in this file to work correctly.
51 set $obj = (unsigned long) $arg0
52 if dbg_USE_MINIMAL_TAGBITS
56 set $type = dbg_Lisp_Type_Int
58 set $type = $obj & dbg_typemask
59 if $type == dbg_Lisp_Type_Char
60 set $val = ($obj & dbg_valmask) >> dbg_gctypebits
62 # It's a record pointer
67 # not dbg_USE_MINIMAL_TAGBITS
68 set $val = $obj & dbg_valmask
69 set $type = ($obj & dbg_typemask) >> (dbg_valbits + 1)
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]
77 set $imp = $lheader->implementation
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.
97 if $type == dbg_Lisp_Type_Int
100 if $type == dbg_Lisp_Type_Char
103 if $type == dbg_Lisp_Type_Symbol
106 if $type == dbg_Lisp_Type_String
109 if $type == dbg_Lisp_Type_Vector
112 if $type == dbg_Lisp_Type_Cons
115 printf "record type: %s\n", $imp->name
126 unset env EMACSLOADPATH
127 set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
128 run -batch -l ../lisp/loadup.el run-temacs -q
133 Run temacs interactively, like xemacs.
134 Use this with debugging tools (like purify) that cannot deal with dumping,
135 or when temacs builds successfully, but xemacs does not.
139 unset env EMACSLOADPATH
140 set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
141 run -batch -l ../lisp/update-elc.el
146 Run the core lisp byte compilation part of the build procedure.
147 Use when debugging temacs, not xemacs!
148 Use this when temacs builds successfully, but xemacs does not.
152 unset env EMACSLOADPATH
153 set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
154 run -batch -l ../lisp/loadup.el dump
159 Run the dumping part of the build procedure.
160 Use when debugging temacs, not xemacs!
161 Use this when temacs builds successfully, but xemacs does not.
164 # if you use Purify, do this:
165 # export PURIFYOPTIONS='-pointer-mask=0x0fffffff'
168 printf "%s", "Lisp => "
169 call debug_print($arg0)
173 Usage: ldp lisp_object
174 Print a Lisp Object value using the Lisp printer.
175 Requires a running xemacs process.
179 call debug_backtrace()
184 Print the current Lisp stack trace.
185 Requires a running xemacs process.
189 print $arg0->core.widget_class->core_class.class_name
193 print XrmQuarkToString(((Object)($arg0))->object.xrm_name)
196 # GDB's command language makes you want to ...
199 set $xstruct = (struct $arg0 *) $val
206 if $type == dbg_Lisp_Type_Int
207 printf "Integer: %d\n", $val
209 if $type == dbg_Lisp_Type_Char
211 printf "Char: %c\n", $val
213 printf "Char: %d\n", $val
216 if $type == dbg_Lisp_Type_String || $imp == lrecord_string
219 if $type == dbg_Lisp_Type_Cons || $imp == lrecord_cons
222 if $type == dbg_Lisp_Type_Symbol || $imp == lrecord_symbol
224 printf "Symbol name: %s\n", $xstruct->name->_data
226 if $type == dbg_Lisp_Type_Vector || $imp == lrecord_vector
228 printf "Vector of length %d\n", $xstruct->size
229 #print *($xstruct->_data) @ $xstruct->size
231 if $imp == lrecord_bit_vector
232 pstruct Lisp_Bit_Vector
234 if $imp == lrecord_buffer
237 if $imp == lrecord_char_table
238 pstruct Lisp_Char_Table
240 if $imp == lrecord_char_table_entry
241 pstruct Lisp_Char_Table_Entry
243 if $imp == lrecord_charset
246 if $imp == lrecord_coding_system
247 pstruct Lisp_Coding_System
249 if $imp == lrecord_color_instance
250 pstruct Lisp_Color_Instance
252 if $imp == lrecord_command_builder
253 pstruct command_builder
255 if $imp == lrecord_compiled_function
256 pstruct Lisp_Compiled_Function
258 if $imp == lrecord_console
261 if $imp == lrecord_database
264 if $imp == lrecord_device
267 if $imp == lrecord_event
270 if $imp == lrecord_extent
273 if $imp == lrecord_extent_auxiliary
274 pstruct extent_auxiliary
276 if $imp == lrecord_extent_info
279 if $imp == lrecord_face
282 if $imp == lrecord_float
285 if $imp == lrecord_font_instance
286 pstruct Lisp_Font_Instance
288 if $imp == lrecord_frame
291 if $imp == lrecord_glyph
294 if $imp == lrecord_hashtable
297 if $imp == lrecord_image_instance
298 pstruct Lisp_Image_Instance
300 if $imp == lrecord_keymap
303 if $imp == lrecord_lcrecord_list
304 pstruct lcrecord_list
306 if $imp == lrecord_lstream
309 if $imp == lrecord_marker
312 if $imp == lrecord_opaque
315 if $imp == lrecord_opaque_list
316 pstruct Lisp_Opaque_List
318 if $imp == lrecord_popup_data
321 if $imp == lrecord_process
324 if $imp == lrecord_range_table
325 pstruct Lisp_Range_Table
327 if $imp == lrecord_specifier
328 pstruct Lisp_Specifier
330 if $imp == lrecord_subr
333 if $imp == lrecord_symbol_value_buffer_local
334 pstruct symbol_value_buffer_local
336 if $imp == lrecord_symbol_value_forward
337 pstruct symbol_value_forward
339 if $imp == lrecord_symbol_value_lisp_magic
340 pstruct symbol_value_lisp_magic
342 if $imp == lrecord_symbol_value_varalias
343 pstruct symbol_value_varalias
345 if $imp == lrecord_toolbar_button
346 pstruct toolbar_button
348 if $imp == lrecord_tooltalk_message
349 pstruct Lisp_Tooltalk_Message
351 if $imp == lrecord_tooltalk_pattern
352 pstruct Lisp_Tooltalk_Pattern
354 if $imp == lrecord_weak_list
357 if $imp == lrecord_window
360 if $imp == lrecord_window_configuration
361 pstruct window_config
363 echo Unknown Lisp Object type\n
419 Usage: pobj lisp_object
420 Print the internal C structure of a underlying Lisp Object.