Mercurial > hg > xemacs-beta
comparison src/dbxrc @ 272:c5d627a313b1 r21-0b34
Import from CVS: tag r21-0b34
| author | cvs |
|---|---|
| date | Mon, 13 Aug 2007 10:28:48 +0200 |
| parents | ac2d302a0011 |
| children | 558f606b08ae |
comparison
equal
deleted
inserted
replaced
| 271:c7b7086b0a39 | 272:c5d627a313b1 |
|---|---|
| 1 # -*- ksh -*- | 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 | |
| 2 # You can use this file to debug XEmacs using Sun WorkShop's dbx. | 23 # You can use this file to debug XEmacs using Sun WorkShop's dbx. |
| 3 # Add the contents of this file to $HOME/.dbxrc or | 24 # Add the contents of this file to $HOME/.dbxrc or |
| 4 # Source the contents of this file with something like: | 25 # Source the contents of this file with something like: |
| 5 # test -r ./dbxrc && . ./dbxrc | 26 # test -r ./dbxrc && . ./dbxrc |
| 6 | 27 |
| 28 # Some functions defined here require a running process, but most | |
| 29 # don't. Considerable effort has been expended to this end. | |
| 30 | |
| 31 # See also the comments in gdbinit. | |
| 32 | |
| 33 # See also the question of the XEmacs FAQ, titled | |
| 34 # "How to Debug an XEmacs problem with a debugger". | |
| 35 | |
| 7 ignore POLL | 36 ignore POLL |
| 8 ignore IO | 37 ignore IO |
| 9 | 38 |
| 39 document lbt << 'end' | |
| 40 Usage: lbt | |
| 41 Print the current Lisp stack trace. | |
| 42 Requires a running xemacs process. | |
| 43 end | |
| 44 | |
| 10 function lbt { | 45 function lbt { |
| 11 call Fbacktrace (Qexternal_debugging_output, Qt) | 46 call debug_backtrace() |
| 12 } | 47 } |
| 13 | 48 |
| 14 function dp { | 49 document ldp << 'end' |
| 50 Usage: ldp lisp_object | |
| 51 Print a Lisp Object value using the Lisp printer. | |
| 52 Requires a running xemacs process. | |
| 53 end | |
| 54 | |
| 55 function ldp { | |
| 15 call debug_print ($1); | 56 call debug_print ($1); |
| 16 } | 57 } |
| 17 | 58 |
| 18 function xptr { | 59 # A bug in dbx prevents string variables from having values beginning with `-'!! |
| 19 print ("$1"<<4) & 0xFFFFFFF) | 60 function XEmacsInit { |
| 61 eval $(echo $(whatis -t `alloc.c`dbg_constants) | \ | |
| 62 perl -e 'print "@{[map {s/=(-\d+)/sprintf(q[=0x%x],$1)/oge; /\w+=[0-9a-fx]+/og} <>]}\n"') | |
| 63 xemacs_initted=yes | |
| 64 #printvar dbg_valbits dbg_valmask | |
| 65 } | |
| 66 | |
| 67 function printvar { | |
| 68 for i in $*; do eval "echo $i=\$$i"; done | |
| 69 } | |
| 70 | |
| 71 document decode_object << 'end' | |
| 72 Usage: decode_object lisp_object | |
| 73 Extract implementation information from a Lisp Object. | |
| 74 Defines variables $val, $type and $imp. | |
| 75 end | |
| 76 | |
| 77 # Various dbx bugs cause ugliness in following code | |
| 78 function decode_object { | |
| 79 test -z "$xemacs_initted" && XEmacsInit | |
| 80 obj=$[*(void**)(&$1)] | |
| 81 test "$obj" = "(nil)" && obj="0x0" | |
| 82 if test $dbg_USE_MINIMAL_TAGBITS = 1; then | |
| 83 if test $[(int)($obj & 1)] = 1; then | |
| 84 # It's an int | |
| 85 val=$[(long)(((unsigned long long)$obj) >> 1)] | |
| 86 type=$dbg_Lisp_Type_Int | |
| 87 else | |
| 88 type=$[(int)(((void*)$obj) & $dbg_typemask)] | |
| 89 if test $type = $dbg_Lisp_Type_Char; then | |
| 90 val=$[(void*)(long)(((unsigned long long)($obj & $dbg_valmask)) >> $dbg_gctypebits)] | |
| 91 else | |
| 92 # It's a record pointer | |
| 93 val=$[(void*)$obj] | |
| 94 fi | |
| 95 fi | |
| 96 else | |
| 97 # not dbg_USE_MINIMAL_TAGBITS | |
| 98 val=$[(void*)($obj & $dbg_valmask)] | |
| 99 test "$val" = "(nil)" && val="0x0" | |
| 100 type=$[(int)(((unsigned long long)($obj & $dbg_typemask)) >> ($dbg_valbits + 1))] | |
| 101 fi | |
| 102 | |
| 103 if test $type = $dbg_Lisp_Type_Record; then | |
| 104 typeset lheader="((struct lrecord_header *) $val)" | |
| 105 if test $dbg_USE_INDEXED_LRECORD_IMPLEMENTATION = 1; then | |
| 106 imp=$[(void*)(lrecord_implementations_table[$lheader->type])] | |
| 107 else | |
| 108 imp=$[(void*)($lheader->implementation)] | |
| 109 fi | |
| 110 else | |
| 111 imp="0xdeadbeef" | |
| 112 fi | |
| 113 #printvar obj val type imp | |
| 20 } | 114 } |
| 21 | 115 |
| 22 function xint { | 116 function xint { |
| 23 print ((int)($1 << 4))>>4; | 117 decode_object "$*" |
| 24 } | 118 print (long) ($val) |
| 25 | 119 } |
| 26 #function xstring { | 120 |
| 27 # print *(struct Lisp_String *) ($1 & 0xFFFFFFF); | 121 function xtype { |
| 28 # #print ((struct Lisp_String *) ($1 & 0xFFFFFFF))->_data; | 122 decode_object "$*" |
| 29 #} | 123 if test $type = $dbg_Lisp_Type_Int; then echo "int" |
| 30 | 124 elif test $type = $dbg_Lisp_Type_Char; then echo "char" |
| 31 function xlisp { | 125 elif test $type = $dbg_Lisp_Type_Symbol; then echo "symbol" |
| 32 print $1 ($2 & 0xFFFFFFF); | 126 elif test $type = $dbg_Lisp_Type_String; then echo "string" |
| 33 #print ((struct Lisp_String *) ($1 & 0xFFFFFFF))->_data; | 127 elif test $type = $dbg_Lisp_Type_Vector; then echo "vector" |
| 34 } | 128 elif test $type = $dbg_Lisp_Type_Cons; then echo "cons" |
| 35 | 129 else |
| 36 function defxlisp { | 130 echo "record type with name: $[((struct lrecord_implementation *)$imp)->name]" |
| 37 eval "function $1 { print $2 (\$1 & 0xFFFFFFF) ; }" | 131 fi |
| 38 } | 132 } |
| 39 | 133 |
| 40 function defxstruct { | 134 document run-temacs << 'end' |
| 41 defxlisp "$1" "*(struct $2 *)" | 135 Usage: run-temacs |
| 42 } | 136 Run temacs interactively, like xemacs. |
| 43 | 137 Use this with debugging tools (like purify) that cannot deal with dumping, |
| 44 defxstruct xstring 'Lisp_String' | 138 or when temacs builds successfully, but xemacs does not. |
| 45 defxstruct xlstream 'lstream' | 139 end |
| 46 defxstruct xsubr 'Lisp_Subr' | 140 |
| 47 defxstruct xbitvec 'Lisp_Bit_Vector' | 141 function run-temacs { |
| 48 defxstruct xbuffer 'buffer' | 142 run -batch -l loadup.el run-temacs -q |
| 49 defxstruct xbytecode 'Lisp_Bytecode' | 143 } |
| 50 defxstruct xcharset 'Lisp_Charset' | 144 |
| 51 defxstruct xchartab 'Lisp_Char_Table' | 145 document update-elc << 'end' |
| 52 defxstruct xchartabentry 'Lisp_Char_Table_Entry' | 146 Usage: update-elc |
| 53 defxstruct xcodesys 'Lisp_Coding_System' | 147 Run the elc compilation part of the build procedure. |
| 54 defxstruct xcolorinst 'Lisp_Color_Instance' | 148 Use when debugging temacs, not xemacs! |
| 55 defxstruct xcons 'Lisp_Cons' | 149 Use this when temacs builds successfully, but xemacs does not. |
| 56 defxstruct xdevice 'device' | 150 end |
| 57 defxstruct xevent 'Lisp_Event' | 151 |
| 58 defxstruct xextent 'extent' | 152 function update-elc { |
| 59 defxstruct xextentaux 'extent_auxilliary' | 153 export EMACSLOADPATH=../lisp/ |
| 60 defxstruct xfloat 'Lisp_Float' | 154 run -batch -l update-elc.el |
| 61 defxstruct xfontinst 'Lisp_Font_Instance' | 155 } |
| 62 defxstruct xframe 'frame' | 156 |
| 63 defxstruct xglyph 'Lisp_Glyph' | 157 function pstruct { |
| 64 defxstruct xhashtable 'hashtable_struct' | 158 xstruct="((struct $1 *) $val)" |
| 65 defxstruct ximageinst 'Lisp_Image_Instance' | 159 print $xstruct |
| 66 defxstruct xkeymap 'keymap' | 160 print *$xstruct |
| 67 defxstruct xmarker 'Lisp_Marker' | 161 } |
| 68 defxstruct xmenubardata 'menubar_data' | 162 |
| 69 defxstruct xopaque 'Lisp_Opaque' | 163 function lrecord_type_p { |
| 70 defxstruct xprocess 'Lisp_Process' | 164 if eval test -z \"\$lrecord_$1\" && test $imp = $[(void*)(&lrecord_$1)]; then return 0; else return 1; fi |
| 71 defxstruct xrangetab 'Lisp_Range_Table' | 165 } |
| 72 defxstruct xspec 'Lisp_Specifier' | 166 |
| 73 defxstruct xsubwindow 'Lisp_Subwindow' | 167 document pobj << 'end' |
| 74 defxstruct xsymbol 'Lisp_Symbol' | 168 Usage: pobj lisp_object |
| 75 defxstruct xtoolbarbutton 'toolbar_button' | 169 Print the internal C structure of a underlying Lisp Object. |
| 76 defxstruct xtoolbardata 'toolbar_data' | 170 end |
| 77 defxstruct xtooltalkmess 'Lisp_Tooltalk_Message' | 171 |
| 78 defxstruct xtooltalkpatt 'Lisp_Tooltalk_Pattern' | 172 function pobj { |
| 79 defxstruct xvector 'Lisp_Vector' | 173 decode_object $1 |
| 80 defxstruct xwindow 'window' | 174 if test $type = $dbg_Lisp_Type_Int; then |
| 81 defxstruct xwindowconfig 'window_config' | 175 print -f"Integer: %d" $val |
| 176 elif test $type = $dbg_Lisp_Type_Char; then | |
| 177 if $val < 128; then | |
| 178 print -f"Char: %c" $val | |
| 179 else | |
| 180 print -f"Char: %d" $val | |
| 181 fi | |
| 182 elif test $type = $dbg_Lisp_Type_String || lrecord_type_p string; then | |
| 183 pstruct Lisp_String | |
| 184 elif test $type = $dbg_Lisp_Type_Cons || lrecord_type_p cons; then | |
| 185 pstruct Lisp_Cons | |
| 186 elif test $type = $dbg_Lisp_Type_Symbol || lrecord_type_p symbol; then | |
| 187 pstruct Lisp_Symbol | |
| 188 echo "Symbol name: $[(char *)($xstruct->name->_data)]" | |
| 189 elif test $type = $dbg_Lisp_Type_Vector || lrecord_type_p vector; then | |
| 190 pstruct Lisp_Vector | |
| 191 echo "Vector of length $[$xstruct->size]" | |
| 192 elif lrecord_type_p bit_vector; then | |
| 193 pstruct Lisp_Bit_Vector | |
| 194 elif lrecord_type_p buffer; then | |
| 195 pstruct buffer | |
| 196 elif lrecord_type_p char_table; then | |
| 197 pstruct Lisp_Char_Table | |
| 198 elif lrecord_type_p char_table_entry; then | |
| 199 pstruct Lisp_Char_Table_Entry | |
| 200 elif lrecord_type_p charset; then | |
| 201 pstruct Lisp_Charset | |
| 202 elif lrecord_type_p coding_system; then | |
| 203 pstruct Lisp_Coding_System | |
| 204 elif lrecord_type_p color_instance; then | |
| 205 pstruct Lisp_Color_Instance | |
| 206 elif lrecord_type_p command_builder; then | |
| 207 pstruct command_builder | |
| 208 elif lrecord_type_p compiled_function; then | |
| 209 pstruct Lisp_Compiled_Function | |
| 210 elif lrecord_type_p console; then | |
| 211 pstruct console | |
| 212 elif lrecord_type_p database; then | |
| 213 pstruct database | |
| 214 elif lrecord_type_p device; then | |
| 215 pstruct device | |
| 216 elif lrecord_type_p event; then | |
| 217 pstruct Lisp_Event | |
| 218 elif lrecord_type_p extent; then | |
| 219 pstruct extent | |
| 220 elif lrecord_type_p extent_auxiliary; then | |
| 221 pstruct extent_auxiliary | |
| 222 elif lrecord_type_p extent_info; then | |
| 223 pstruct extent_info | |
| 224 elif lrecord_type_p face; then | |
| 225 pstruct Lisp_Face | |
| 226 elif lrecord_type_p float; then | |
| 227 pstruct Lisp_Float | |
| 228 elif lrecord_type_p font_instance; then | |
| 229 pstruct Lisp_Font_Instance | |
| 230 elif lrecord_type_p frame; then | |
| 231 pstruct frame | |
| 232 elif lrecord_type_p glyph; then | |
| 233 pstruct Lisp_Glyph | |
| 234 elif lrecord_type_p hashtable; then | |
| 235 pstruct hashtable | |
| 236 elif lrecord_type_p image_instance; then | |
| 237 pstruct Lisp_Image_Instance | |
| 238 elif lrecord_type_p keymap; then | |
| 239 pstruct keymap | |
| 240 elif lrecord_type_p lcrecord_list; then | |
| 241 pstruct lcrecord_list | |
| 242 elif lrecord_type_p lstream; then | |
| 243 pstruct lstream | |
| 244 elif lrecord_type_p marker; then | |
| 245 pstruct Lisp_Marker | |
| 246 elif lrecord_type_p opaque; then | |
| 247 pstruct Lisp_Opaque | |
| 248 elif lrecord_type_p opaque_list; then | |
| 249 pstruct Lisp_Opaque_List | |
| 250 elif lrecord_type_p popup_data; then | |
| 251 pstruct popup_data | |
| 252 elif lrecord_type_p process; then | |
| 253 pstruct Lisp_Process | |
| 254 elif lrecord_type_p range_table; then | |
| 255 pstruct Lisp_Range_Table | |
| 256 elif lrecord_type_p specifier; then | |
| 257 pstruct Lisp_Specifier | |
| 258 elif lrecord_type_p subr; then | |
| 259 pstruct Lisp_Subr | |
| 260 elif lrecord_type_p symbol_value_buffer_local; then | |
| 261 pstruct symbol_value_buffer_local | |
| 262 elif lrecord_type_p symbol_value_forward; then | |
| 263 pstruct symbol_value_forward | |
| 264 elif lrecord_type_p symbol_value_lisp_magic; then | |
| 265 pstruct symbol_value_lisp_magic | |
| 266 elif lrecord_type_p symbol_value_varalias; then | |
| 267 pstruct symbol_value_varalias | |
| 268 elif lrecord_type_p toolbar_button; then | |
| 269 pstruct toolbar_button | |
| 270 elif lrecord_type_p toolbar_data; then | |
| 271 pstruct toolbar_data | |
| 272 elif lrecord_type_p tooltalk_message; then | |
| 273 pstruct Lisp_Tooltalk_Message | |
| 274 elif lrecord_type_p tooltalk_pattern; then | |
| 275 pstruct Lisp_Tooltalk_Pattern | |
| 276 elif lrecord_type_p weak_list; then | |
| 277 pstruct weak_list | |
| 278 elif lrecord_type_p window; then | |
| 279 pstruct window | |
| 280 elif lrecord_type_p window_configuration; then | |
| 281 pstruct window_config | |
| 282 else | |
| 283 echo "Unknown Lisp Object type" | |
| 284 print $1 | |
| 285 fi | |
| 286 } | |
| 82 | 287 |
| 83 function pproc { | 288 function pproc { |
| 84 print *(`process.c`struct Lisp_Process*)$1 ; | 289 print *(`process.c`struct Lisp_Process*)$1 ; |
| 85 dp "(`process.c`struct Lisp_Process*)$1->name" ; | 290 ldp "(`process.c`struct Lisp_Process*)$1->name" ; |
| 86 dp "(`process.c`struct Lisp_Process*)$1->command" ; | 291 ldp "(`process.c`struct Lisp_Process*)$1->command" ; |
| 87 } | |
| 88 | |
| 89 function xtype { | |
| 90 print (enum Lisp_Type) (($1 >> 28) & 7) | |
| 91 } | 292 } |
| 92 | 293 |
| 93 dbxenv suppress_startup_message 4.0 | 294 dbxenv suppress_startup_message 4.0 |
| 94 | |
| 95 function dp_args { | |
| 96 dp "*(((Lisp_Object*)($1))+0)" | |
| 97 dp "*(((Lisp_Object*)($1))+1)" | |
| 98 } | |
| 99 | 295 |
| 100 function dp_core { | 296 function dp_core { |
| 101 print ((struct x_frame *)(((struct frame*)(Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget->core | 297 print ((struct x_frame *)(((struct frame*)(Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget->core |
| 102 } | 298 } |
| 103 | 299 |
