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 run -batch -vanilla -f list-load-path-shadows
129 document lisp-shadows
131 Run xemacs to check for lisp shadows
134 define environment-to-run-temacs
135 unset env EMACSLOADPATH
136 set env EMACSBOOTSTRAPLOADPATH = ../lisp/:..
137 set env EMACSBOOTSTRAPMODULEPATH = ../lisp/
141 environment-to-run-temacs
142 run -batch -l ../lisp/loadup.el run-temacs -q
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.
153 environment-to-run-temacs
154 run -batch -l ../lisp/update-elc.el
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.
165 environment-to-run-temacs
166 run -batch -l ../lisp/loadup.el dump
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.
176 # if you use Purify, do this:
177 # export PURIFYOPTIONS='-pointer-mask=0x0fffffff'
180 printf "%s", "Lisp => "
181 call debug_print($arg0)
185 Usage: ldp lisp_object
186 Print a Lisp Object value using the Lisp printer.
187 Requires a running xemacs process.
191 call debug_backtrace()
196 Print the current Lisp stack trace.
197 Requires a running xemacs process.
201 print $arg0->core.widget_class->core_class.class_name
205 print XrmQuarkToString(((Object)($arg0))->object.xrm_name)
208 # GDB's command language makes you want to ...
211 set $xstruct = (struct $arg0 *) $val
218 if $type == dbg_Lisp_Type_Int
219 printf "Integer: %d\n", $val
221 if $type == dbg_Lisp_Type_Char
223 printf "Char: %c\n", $val
225 printf "Char: %d\n", $val
228 if $type == dbg_Lisp_Type_String || $imp == lrecord_string
231 if $type == dbg_Lisp_Type_Cons || $imp == lrecord_cons
234 if $type == dbg_Lisp_Type_Symbol || $imp == lrecord_symbol
236 printf "Symbol name: %s\n", $xstruct->name->data
238 if $type == dbg_Lisp_Type_Vector || $imp == lrecord_vector
240 printf "Vector of length %d\n", $xstruct->size
241 #print *($xstruct->data) @ $xstruct->size
243 if $imp == lrecord_bit_vector
244 pstruct Lisp_Bit_Vector
246 if $imp == lrecord_buffer
249 if $imp == lrecord_char_table
250 pstruct Lisp_Char_Table
252 if $imp == lrecord_char_table_entry
253 pstruct Lisp_Char_Table_Entry
255 if $imp == lrecord_charset
258 if $imp == lrecord_coding_system
259 pstruct Lisp_Coding_System
261 if $imp == lrecord_color_instance
262 pstruct Lisp_Color_Instance
264 if $imp == lrecord_command_builder
265 pstruct command_builder
267 if $imp == lrecord_compiled_function
268 pstruct Lisp_Compiled_Function
270 if $imp == lrecord_console
273 if $imp == lrecord_database
274 pstruct Lisp_Database
276 if $imp == lrecord_device
279 if $imp == lrecord_event
282 if $imp == lrecord_extent
285 if $imp == lrecord_extent_auxiliary
286 pstruct extent_auxiliary
288 if $imp == lrecord_extent_info
291 if $imp == lrecord_face
294 if $imp == lrecord_float
297 if $imp == lrecord_font_instance
298 pstruct Lisp_Font_Instance
300 if $imp == lrecord_frame
303 if $imp == lrecord_glyph
306 if $imp == lrecord_hash_table
307 pstruct Lisp_Hash_Table
309 if $imp == lrecord_image_instance
310 pstruct Lisp_Image_Instance
312 if $imp == lrecord_keymap
315 if $imp == lrecord_lcrecord_list
316 pstruct lcrecord_list
318 if $imp == lrecord_lstream
321 if $imp == lrecord_marker
324 if $imp == lrecord_opaque
327 if $imp == lrecord_opaque_list
328 pstruct Lisp_Opaque_List
330 if $imp == lrecord_popup_data
333 if $imp == lrecord_process
336 if $imp == lrecord_range_table
337 pstruct Lisp_Range_Table
339 if $imp == lrecord_specifier
340 pstruct Lisp_Specifier
342 if $imp == lrecord_subr
345 if $imp == lrecord_symbol_value_buffer_local
346 pstruct symbol_value_buffer_local
348 if $imp == lrecord_symbol_value_forward
349 pstruct symbol_value_forward
351 if $imp == lrecord_symbol_value_lisp_magic
352 pstruct symbol_value_lisp_magic
354 if $imp == lrecord_symbol_value_varalias
355 pstruct symbol_value_varalias
357 if $imp == lrecord_toolbar_button
358 pstruct toolbar_button
360 if $imp == lrecord_tooltalk_message
361 pstruct Lisp_Tooltalk_Message
363 if $imp == lrecord_tooltalk_pattern
364 pstruct Lisp_Tooltalk_Pattern
366 if $imp == lrecord_weak_list
369 if $imp == lrecord_window
372 if $imp == lrecord_window_configuration
373 pstruct window_config
375 echo Unknown Lisp Object type\n
393 # Repeat after me... gdb sux, gdb sux, gdb sux...
412 # Are we having fun yet??
433 Usage: pobj lisp_object
434 Print the internal C structure of a underlying Lisp Object.