3969701b77c8464ea2222508d9fb251b57d9e42d
[chise/xemacs-chise.git-] / src / .dbxrc
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 # You can use this file to debug XEmacs using Sun WorkShop's dbx.
24
25 # Some functions defined here require a running process, but most
26 # don't.  Considerable effort has been expended to this end.
27
28 # Since this file is called `.dbxrc', it will be read by dbx
29 # automatically when dbx is run in the build directory, which is where
30 # developers usually debug their xemacs.
31
32 # See also the comments in .gdbinit.
33
34 # See also the question of the XEmacs FAQ, titled
35 # "How to Debug an XEmacs problem with a debugger".
36
37 # gdb sources the ./.gdbinit in _addition_ to ~/.gdbinit.
38 # But dbx does _not_ source ~/.dbxrc if it found ./.dbxrc.
39 # So we simulate the gdb algorithm by doing it ourselves here.
40 if test -r $HOME/.dbxrc; then . $HOME/.dbxrc; fi
41
42 dbxenv language_mode ansic
43
44 ignore POLL
45 ignore IO
46
47 document lbt << 'end'
48 Usage: lbt
49 Print the current Lisp stack trace.
50 Requires a running xemacs process.
51 end
52
53 function lbt {
54   call debug_backtrace()
55 }
56
57 document ldp << 'end'
58 Usage: ldp lisp_object
59 Print a Lisp Object value using the Lisp printer.
60 Requires a running xemacs process.
61 end
62
63 function ldp {
64   call debug_print ($1);
65 }
66
67 # A bug in dbx prevents string variables from having values beginning with `-'!!
68 function XEmacsInit {
69   function ToInt { eval "$1=\$[(int) \`alloc.c\`$1]"; }
70   ToInt dbg_USE_UNION_TYPE
71   ToInt Lisp_Type_Int
72   ToInt Lisp_Type_Char
73   ToInt Lisp_Type_Cons
74   ToInt Lisp_Type_String
75   ToInt Lisp_Type_Vector
76   ToInt Lisp_Type_Symbol
77   ToInt Lisp_Type_Record
78   ToInt dbg_valbits
79   ToInt dbg_gctypebits
80   function ToLong { eval "$1=\$[(\`alloc.c\`unsigned long) \`alloc.c\`$1]"; }
81   ToLong dbg_valmask
82   ToLong dbg_typemask
83   xemacs_initted=yes
84 }
85
86 function printvar {
87   for i in $*; do eval "echo $i=\$$i"; done
88 }
89
90 document decode_object << 'end'
91 Usage: decode_object lisp_object
92 Extract implementation information from a Lisp Object.
93 Defines variables $val, $type and $imp.
94 end
95
96 # Various dbx bugs cause ugliness in following code
97 function decode_object {
98   if test -z "$xemacs_initted"; then XEmacsInit; fi;
99   if test $dbg_USE_UNION_TYPE = 1; then
100     # Repeat after me... dbx sux, dbx sux, dbx sux...
101     # Allow both `pobj Qnil' and `pobj 0x82746834' to work
102     case $(whatis $1) in
103       *Lisp_Object*) obj="$[(`alloc.c`unsigned long)(($1).i)]";;
104       *) obj="$[(`alloc.c`unsigned long)($1)]";;
105     esac
106   else
107     obj="$[(`alloc.c`unsigned long)($1)]";
108   fi
109   if test $[(int)($obj & 1)] = 1; then
110     # It's an int
111     val=$[(long)(((unsigned long long)$obj) >> 1)]
112     type=$Lisp_Type_Int
113   else
114     type=$[(int)(((void*)$obj) & $dbg_typemask)]
115     if test $type = $Lisp_Type_Char; then
116       val=$[(void*)(long)(((unsigned long long)($obj & $dbg_valmask)) >> $dbg_gctypebits)]
117     else
118       # It's a record pointer
119       val=$[(void*)$obj]
120       if test "$val" = "(nil)"; then type=null_pointer; fi
121     fi
122   fi
123
124   if test $type = $Lisp_Type_Record; then
125     typeset lheader="((struct lrecord_header *) $val)"
126     imp=$[(void*)(`alloc.c`lrecord_implementations_table[$lheader->type])]
127   else
128     imp="0xdeadbeef"
129   fi
130   # printvar obj val type imp
131 }
132
133 function xint {
134   decode_object "$*"
135   print (long) ($val)
136 }
137
138 document xtype << 'end'
139 Usage: xtype lisp_object
140 Print the Lisp type of a lisp object.
141 end
142
143 function xtype {
144   decode_object "$*"
145   if   test $type = $Lisp_Type_Int;    then echo "int"
146   elif test $type = $Lisp_Type_Char;   then echo "char"
147   elif test $type = $Lisp_Type_Symbol; then echo "symbol"
148   elif test $type = $Lisp_Type_String; then echo "string"
149   elif test $type = $Lisp_Type_Vector; then echo "vector"
150   elif test $type = $Lisp_Type_Cons;   then echo "cons"
151   elif test $type = null_pointer;      then echo "null_pointer"
152   else
153     echo "record type with name: $[((struct lrecord_implementation *)$imp)->name]"
154   fi
155 }
156
157 function lisp-shadows {
158   run -batch -vanilla -f list-load-path-shadows
159 }
160
161 function environment-to-run-temacs {
162   unset EMACSLOADPATH
163   export EMACSBOOTSTRAPLOADPATH=../lisp/:..
164   export EMACSBOOTSTRAPMODULEPATH=../modules/:..
165 }
166
167 document run-temacs << 'end'
168 Usage: run-temacs
169 Run temacs interactively, like xemacs.
170 Use this with debugging tools (like purify) that cannot deal with dumping,
171 or when temacs builds successfully, but xemacs does not.
172 end
173
174 function run-temacs {
175   environment-to-run-temacs
176   run -batch -l ../lisp/loadup.el run-temacs -q ${1+"$@"}
177 }
178
179 document check-xemacs << 'end'
180 Usage: check-xemacs
181 Run the test suite.  Equivalent to 'make check'.
182 end
183
184 function check-xemacs {
185   run -batch -l ../tests/automated/test-harness.el -f batch-test-emacs ../tests/automated
186 }
187
188 document check-temacs << 'end'
189 Usage: check-temacs
190 Run the test suite on temacs.  Equivalent to 'make check-temacs'.
191 Use this with debugging tools (like purify) that cannot deal with dumping,
192 or when temacs builds successfully, but xemacs does not.
193 end
194
195 function check-temacs {
196   run-temacs -q -batch -l ../tests/automated/test-harness.el -f batch-test-emacs ../tests/automated
197 }
198
199 document update-elc << 'end'
200 Usage: update-elc
201 Run the core lisp byte compilation part of the build procedure.
202 Use when debugging temacs, not xemacs!
203 Use this when temacs builds successfully, but xemacs does not.
204 end
205
206 function update-elc {
207   environment-to-run-temacs
208   run -batch -l ../lisp/update-elc.el
209 }
210
211 document dump-temacs << 'end'
212 Usage: dump-temacs
213 Run the dumping part of the build procedure.
214 Use when debugging temacs, not xemacs!
215 Use this when temacs builds successfully, but xemacs does not.
216 end
217
218 function dump-temacs {
219   environment-to-run-temacs
220   run -batch -l ../lisp/loadup.el dump
221 }
222
223 function pstruct {
224   xstruct="((struct $1 *) $val)"
225   print $xstruct
226   print *$xstruct
227 }
228
229 function lrecord_type_p {
230   if eval test -z \"\$lrecord_$1\" && test $imp = $[(void*)(&lrecord_$1)]; then return 0; else return 1; fi
231 }
232
233 document pobj << 'end'
234 Usage: pobj lisp_object
235 Print the internal C representation of a Lisp Object.
236 end
237
238 function pobj {
239   decode_object $1
240   if test $type = $Lisp_Type_Int; then
241     print -f"Integer: %d" $val
242   elif test $type = $Lisp_Type_Char; then
243     if test $[$val > 32 && $val < 128] = 1; then
244       print -f"Char: %c" $val
245     else
246       print -f"Char: %d" $val
247     fi
248   elif test $type = $Lisp_Type_String || lrecord_type_p string; then
249     pstruct Lisp_String
250   elif test $type = $Lisp_Type_Cons   || lrecord_type_p cons; then
251     pstruct Lisp_Cons
252   elif test $type = $Lisp_Type_Symbol || lrecord_type_p symbol; then
253     pstruct Lisp_Symbol
254     echo "Symbol name: $[(char *)($xstruct->name->data)]"
255   elif test $type = $Lisp_Type_Vector || lrecord_type_p vector; then
256     pstruct Lisp_Vector
257     echo "Vector of length $[$xstruct->size]"
258   elif lrecord_type_p bit_vector; then
259     pstruct Lisp_Bit_Vector
260   elif lrecord_type_p buffer; then
261     pstruct buffer
262   elif lrecord_type_p char_table; then
263     pstruct Lisp_Char_Table
264   elif lrecord_type_p char_table_entry; then
265     pstruct Lisp_Char_Table_Entry
266   elif lrecord_type_p charset; then
267     pstruct Lisp_Charset
268   elif lrecord_type_p coding_system; then
269     pstruct Lisp_Coding_System
270   elif lrecord_type_p color_instance; then
271     pstruct Lisp_Color_Instance
272   elif lrecord_type_p command_builder; then
273     pstruct command_builder
274   elif lrecord_type_p compiled_function; then
275     pstruct Lisp_Compiled_Function
276   elif lrecord_type_p console; then
277     pstruct console
278   elif lrecord_type_p database; then
279     pstruct Lisp_Database
280   elif lrecord_type_p device; then
281     pstruct device
282   elif lrecord_type_p event; then
283     pstruct Lisp_Event
284   elif lrecord_type_p extent; then
285     pstruct extent
286   elif lrecord_type_p extent_auxiliary; then
287     pstruct extent_auxiliary
288   elif lrecord_type_p extent_info; then
289     pstruct extent_info
290   elif lrecord_type_p face; then
291     pstruct Lisp_Face
292   elif lrecord_type_p float; then
293     pstruct Lisp_Float
294   elif lrecord_type_p font_instance; then
295     pstruct Lisp_Font_Instance
296   elif lrecord_type_p frame; then
297     pstruct frame
298   elif lrecord_type_p glyph; then
299     pstruct Lisp_Glyph
300   elif lrecord_type_p hash_table; then
301     pstruct Lisp_Hash_Table
302   elif lrecord_type_p image_instance; then
303     pstruct Lisp_Image_Instance
304   elif lrecord_type_p keymap; then
305     pstruct Lisp_Keymap
306   elif lrecord_type_p lcrecord_list; then
307     pstruct lcrecord_list
308   elif lrecord_type_p lstream; then
309     pstruct lstream
310   elif lrecord_type_p marker; then
311     pstruct Lisp_Marker
312   elif lrecord_type_p opaque; then
313     pstruct Lisp_Opaque
314   elif lrecord_type_p opaque_ptr; then
315     pstruct Lisp_Opaque_Ptr
316   elif lrecord_type_p popup_data; then
317     pstruct popup_data
318   elif lrecord_type_p process; then
319     pstruct Lisp_Process
320   elif lrecord_type_p range_table; then
321     pstruct Lisp_Range_Table
322   elif lrecord_type_p specifier; then
323     pstruct Lisp_Specifier
324   elif lrecord_type_p subr; then
325     pstruct Lisp_Subr
326   elif lrecord_type_p symbol_value_buffer_local; then
327     pstruct symbol_value_buffer_local
328   elif lrecord_type_p symbol_value_forward; then
329     pstruct symbol_value_forward
330   elif lrecord_type_p symbol_value_lisp_magic; then
331     pstruct symbol_value_lisp_magic
332   elif lrecord_type_p symbol_value_varalias; then
333     pstruct symbol_value_varalias
334   elif lrecord_type_p toolbar_button; then
335     pstruct toolbar_button
336   elif lrecord_type_p tooltalk_message; then
337     pstruct Lisp_Tooltalk_Message
338   elif lrecord_type_p tooltalk_pattern; then
339     pstruct Lisp_Tooltalk_Pattern
340   elif lrecord_type_p weak_list; then
341     pstruct weak_list
342   elif lrecord_type_p window; then
343     pstruct window
344   elif lrecord_type_p window_configuration; then
345     pstruct window_config
346   elif test "$type" = "null_pointer"; then
347     echo "Lisp Object is a null pointer!!"
348   else
349     echo "Unknown Lisp Object type"
350     print $1
351   fi
352 }
353
354 function pproc {
355   print *(`process.c`struct Lisp_Process*)$1 ;
356   ldp "(`process.c`struct Lisp_Process*)$1->name" ;
357   ldp "(`process.c`struct Lisp_Process*)$1->command" ;
358 }
359
360 dbxenv suppress_startup_message 4.0
361 dbxenv mt_watchpoints on
362
363 function dp_core {
364   print ((struct x_frame *)(((struct frame*)(Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget->core
365 }
366
367 # Barf!
368 function print_shell {
369   print *(`frame-x.c`TopLevelShellRec*) (((struct `frame-x.c`x_frame*) (((struct `frame-x.c`frame*) (Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget)
370 }
371
372 # -------------------------------------------------------------
373 # functions to test the debugging support itself.
374 # If you change this file, make sure the following still work...
375 # -------------------------------------------------------------
376 function test_xtype {
377   function doit { echo -n "$1: "; xtype "$1"; }
378   test_various_objects
379 }
380
381 function test_pobj {
382   function doit { echo '==============================='; echo -n "$1: "; pobj "$1"; }
383   test_various_objects
384 }
385
386 function test_various_objects {
387   doit Vemacs_major_version
388   doit Vhelp_char
389   doit Qnil
390   doit Qunbound
391   doit Vobarray
392   doit Vall_weak_lists
393   doit Vxemacs_codename
394 }