diff 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
line wrap: on
line diff
--- a/src/dbxrc	Mon Aug 13 10:27:41 2007 +0200
+++ b/src/dbxrc	Mon Aug 13 10:28:48 2007 +0200
@@ -1,102 +1,298 @@
 # -*- ksh -*-
+# Copyright (C) 1998 Free Software Foundation, Inc.
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Author: Martin Buchholz
+
 # You can use this file to debug XEmacs using Sun WorkShop's dbx.
 # Add the contents of this file to $HOME/.dbxrc or
 # Source the contents of this file with something like:
 # test -r ./dbxrc && . ./dbxrc
 
+# Some functions defined here require a running process, but most
+# don't.  Considerable effort has been expended to this end.
+
+# See also the comments in gdbinit.
+
+# See also the question of the XEmacs FAQ, titled
+# "How to Debug an XEmacs problem with a debugger".
+
 ignore POLL
 ignore IO
 
+document lbt << 'end'
+Usage: lbt
+Print the current Lisp stack trace.
+Requires a running xemacs process.
+end
+
 function lbt {
-  call Fbacktrace (Qexternal_debugging_output, Qt)
+  call debug_backtrace()
 }
 
-function dp {
+document ldp << 'end'
+Usage: ldp lisp_object
+Print a Lisp Object value using the Lisp printer.
+Requires a running xemacs process.
+end
+
+function ldp {
   call debug_print ($1);
 }
 
-function xptr {
-  print ("$1"<<4) & 0xFFFFFFF)
+# A bug in dbx prevents string variables from having values beginning with `-'!!
+function XEmacsInit {
+  eval $(echo $(whatis -t `alloc.c`dbg_constants) | \
+    perl -e 'print "@{[map {s/=(-\d+)/sprintf(q[=0x%x],$1)/oge; /\w+=[0-9a-fx]+/og} <>]}\n"')
+  xemacs_initted=yes
+  #printvar dbg_valbits dbg_valmask
+}
+
+function printvar {
+  for i in $*; do eval "echo $i=\$$i"; done
+}
+
+document decode_object << 'end'
+Usage: decode_object lisp_object
+Extract implementation information from a Lisp Object.
+Defines variables $val, $type and $imp.
+end
+
+# Various dbx bugs cause ugliness in following code
+function decode_object {
+  test -z "$xemacs_initted" && XEmacsInit
+  obj=$[*(void**)(&$1)]
+  test "$obj" = "(nil)" && obj="0x0"
+  if test $dbg_USE_MINIMAL_TAGBITS = 1; then
+    if test $[(int)($obj & 1)] = 1; then
+      # It's an int
+      val=$[(long)(((unsigned long long)$obj) >> 1)]
+      type=$dbg_Lisp_Type_Int
+    else
+      type=$[(int)(((void*)$obj) & $dbg_typemask)]
+      if test $type = $dbg_Lisp_Type_Char; then
+        val=$[(void*)(long)(((unsigned long long)($obj & $dbg_valmask)) >> $dbg_gctypebits)]
+      else
+        # It's a record pointer
+        val=$[(void*)$obj]
+      fi
+    fi
+  else
+    # not dbg_USE_MINIMAL_TAGBITS
+    val=$[(void*)($obj & $dbg_valmask)]
+    test "$val" = "(nil)" && val="0x0"
+    type=$[(int)(((unsigned long long)($obj & $dbg_typemask)) >> ($dbg_valbits + 1))]
+  fi
+
+  if test $type = $dbg_Lisp_Type_Record; then
+    typeset lheader="((struct lrecord_header *) $val)"
+    if test $dbg_USE_INDEXED_LRECORD_IMPLEMENTATION = 1; then
+      imp=$[(void*)(lrecord_implementations_table[$lheader->type])]
+    else
+      imp=$[(void*)($lheader->implementation)]
+    fi
+  else
+    imp="0xdeadbeef"
+  fi
+  #printvar obj val type imp
 }
 
 function xint {
-  print ((int)($1 << 4))>>4;
+  decode_object "$*"
+  print (long) ($val)
+}
+
+function xtype {
+  decode_object "$*"
+  if   test $type = $dbg_Lisp_Type_Int;    then echo "int"
+  elif test $type = $dbg_Lisp_Type_Char;   then echo "char"
+  elif test $type = $dbg_Lisp_Type_Symbol; then echo "symbol"
+  elif test $type = $dbg_Lisp_Type_String; then echo "string"
+  elif test $type = $dbg_Lisp_Type_Vector; then echo "vector"
+  elif test $type = $dbg_Lisp_Type_Cons;   then echo "cons"
+  else
+    echo "record type with name: $[((struct lrecord_implementation *)$imp)->name]"
+  fi
 }
 
-#function xstring {
-#  print *(struct Lisp_String *) ($1 & 0xFFFFFFF);
-#  #print ((struct Lisp_String *) ($1 & 0xFFFFFFF))->_data;
-#}
+document run-temacs << 'end'
+Usage: run-temacs
+Run temacs interactively, like xemacs.
+Use this with debugging tools (like purify) that cannot deal with dumping,
+or when temacs builds successfully, but xemacs does not.
+end
 
-function xlisp {
-  print $1 ($2 & 0xFFFFFFF);
-  #print ((struct Lisp_String *) ($1 & 0xFFFFFFF))->_data;
+function run-temacs {
+  run -batch -l loadup.el run-temacs -q
 }
 
-function defxlisp {
-  eval "function $1 { print $2 (\$1 & 0xFFFFFFF) ; }"
+document update-elc << 'end'
+Usage: update-elc
+Run the elc compilation part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+function update-elc {
+  export EMACSLOADPATH=../lisp/
+  run -batch -l update-elc.el
 }
 
-function defxstruct {
-  defxlisp "$1" "*(struct $2 *)"
+function pstruct {
+  xstruct="((struct $1 *) $val)"
+  print $xstruct
+  print *$xstruct
+}
+
+function lrecord_type_p {
+  if eval test -z \"\$lrecord_$1\" && test $imp = $[(void*)(&lrecord_$1)]; then return 0; else return 1; fi
 }
 
-defxstruct xstring        'Lisp_String'
-defxstruct xlstream       'lstream'
-defxstruct xsubr          'Lisp_Subr'
-defxstruct xbitvec        'Lisp_Bit_Vector'
-defxstruct xbuffer        'buffer'
-defxstruct xbytecode      'Lisp_Bytecode'
-defxstruct xcharset       'Lisp_Charset'
-defxstruct xchartab       'Lisp_Char_Table'
-defxstruct xchartabentry  'Lisp_Char_Table_Entry'
-defxstruct xcodesys       'Lisp_Coding_System'
-defxstruct xcolorinst     'Lisp_Color_Instance'
-defxstruct xcons          'Lisp_Cons'
-defxstruct xdevice        'device'
-defxstruct xevent         'Lisp_Event'
-defxstruct xextent        'extent'
-defxstruct xextentaux     'extent_auxilliary'
-defxstruct xfloat         'Lisp_Float'
-defxstruct xfontinst      'Lisp_Font_Instance'
-defxstruct xframe         'frame'
-defxstruct xglyph         'Lisp_Glyph'
-defxstruct xhashtable     'hashtable_struct'
-defxstruct ximageinst     'Lisp_Image_Instance'
-defxstruct xkeymap        'keymap'
-defxstruct xmarker        'Lisp_Marker'
-defxstruct xmenubardata   'menubar_data'
-defxstruct xopaque        'Lisp_Opaque'
-defxstruct xprocess       'Lisp_Process'
-defxstruct xrangetab      'Lisp_Range_Table'
-defxstruct xspec          'Lisp_Specifier'
-defxstruct xsubwindow     'Lisp_Subwindow'
-defxstruct xsymbol        'Lisp_Symbol'
-defxstruct xtoolbarbutton 'toolbar_button'
-defxstruct xtoolbardata   'toolbar_data'
-defxstruct xtooltalkmess  'Lisp_Tooltalk_Message'
-defxstruct xtooltalkpatt  'Lisp_Tooltalk_Pattern'
-defxstruct xvector        'Lisp_Vector'
-defxstruct xwindow        'window'
-defxstruct xwindowconfig  'window_config'
+document pobj << 'end'
+Usage: pobj lisp_object
+Print the internal C structure of a underlying Lisp Object.
+end
+
+function pobj {
+  decode_object $1
+  if test $type = $dbg_Lisp_Type_Int; then
+    print -f"Integer: %d" $val
+  elif test $type = $dbg_Lisp_Type_Char; then
+    if $val < 128; then
+      print -f"Char: %c" $val
+    else
+      print -f"Char: %d" $val
+    fi
+  elif test $type = $dbg_Lisp_Type_String || lrecord_type_p string; then
+    pstruct Lisp_String
+  elif test $type = $dbg_Lisp_Type_Cons   || lrecord_type_p cons; then
+    pstruct Lisp_Cons
+  elif test $type = $dbg_Lisp_Type_Symbol || lrecord_type_p symbol; then
+    pstruct Lisp_Symbol
+    echo "Symbol name: $[(char *)($xstruct->name->_data)]"
+  elif test $type = $dbg_Lisp_Type_Vector || lrecord_type_p vector; then
+    pstruct Lisp_Vector
+    echo "Vector of length $[$xstruct->size]"
+  elif lrecord_type_p bit_vector; then
+    pstruct Lisp_Bit_Vector
+  elif lrecord_type_p buffer; then
+    pstruct buffer
+  elif lrecord_type_p char_table; then
+    pstruct Lisp_Char_Table
+  elif lrecord_type_p char_table_entry; then
+    pstruct Lisp_Char_Table_Entry
+  elif lrecord_type_p charset; then
+    pstruct Lisp_Charset
+  elif lrecord_type_p coding_system; then
+    pstruct Lisp_Coding_System
+  elif lrecord_type_p color_instance; then
+    pstruct Lisp_Color_Instance
+  elif lrecord_type_p command_builder; then
+    pstruct command_builder
+  elif lrecord_type_p compiled_function; then
+    pstruct Lisp_Compiled_Function
+  elif lrecord_type_p console; then
+    pstruct console
+  elif lrecord_type_p database; then
+    pstruct database
+  elif lrecord_type_p device; then
+    pstruct device
+  elif lrecord_type_p event; then
+    pstruct Lisp_Event
+  elif lrecord_type_p extent; then
+    pstruct extent
+  elif lrecord_type_p extent_auxiliary; then
+    pstruct extent_auxiliary
+  elif lrecord_type_p extent_info; then
+    pstruct extent_info
+  elif lrecord_type_p face; then
+    pstruct Lisp_Face
+  elif lrecord_type_p float; then
+    pstruct Lisp_Float
+  elif lrecord_type_p font_instance; then
+    pstruct Lisp_Font_Instance
+  elif lrecord_type_p frame; then
+    pstruct frame
+  elif lrecord_type_p glyph; then
+    pstruct Lisp_Glyph
+  elif lrecord_type_p hashtable; then
+    pstruct hashtable
+  elif lrecord_type_p image_instance; then
+    pstruct Lisp_Image_Instance
+  elif lrecord_type_p keymap; then
+    pstruct keymap
+  elif lrecord_type_p lcrecord_list; then
+    pstruct lcrecord_list
+  elif lrecord_type_p lstream; then
+    pstruct lstream
+  elif lrecord_type_p marker; then
+    pstruct Lisp_Marker
+  elif lrecord_type_p opaque; then
+    pstruct Lisp_Opaque
+  elif lrecord_type_p opaque_list; then
+    pstruct Lisp_Opaque_List
+  elif lrecord_type_p popup_data; then
+    pstruct popup_data
+  elif lrecord_type_p process; then
+    pstruct Lisp_Process
+  elif lrecord_type_p range_table; then
+    pstruct Lisp_Range_Table
+  elif lrecord_type_p specifier; then
+    pstruct Lisp_Specifier
+  elif lrecord_type_p subr; then
+    pstruct Lisp_Subr
+  elif lrecord_type_p symbol_value_buffer_local; then
+    pstruct symbol_value_buffer_local
+  elif lrecord_type_p symbol_value_forward; then
+    pstruct symbol_value_forward
+  elif lrecord_type_p symbol_value_lisp_magic; then
+    pstruct symbol_value_lisp_magic
+  elif lrecord_type_p symbol_value_varalias; then
+    pstruct symbol_value_varalias
+  elif lrecord_type_p toolbar_button; then
+    pstruct toolbar_button
+  elif lrecord_type_p toolbar_data; then
+    pstruct toolbar_data
+  elif lrecord_type_p tooltalk_message; then
+    pstruct Lisp_Tooltalk_Message
+  elif lrecord_type_p tooltalk_pattern; then
+    pstruct Lisp_Tooltalk_Pattern
+  elif lrecord_type_p weak_list; then
+    pstruct weak_list
+  elif lrecord_type_p window; then
+    pstruct window
+  elif lrecord_type_p window_configuration; then
+    pstruct window_config
+  else
+    echo "Unknown Lisp Object type"
+    print $1
+  fi
+}
 
 function pproc {
   print *(`process.c`struct Lisp_Process*)$1 ;
-  dp "(`process.c`struct Lisp_Process*)$1->name" ;
-  dp "(`process.c`struct Lisp_Process*)$1->command" ;
-}
-
-function xtype {
-  print (enum Lisp_Type) (($1 >> 28) & 7)
+  ldp "(`process.c`struct Lisp_Process*)$1->name" ;
+  ldp "(`process.c`struct Lisp_Process*)$1->command" ;
 }
 
 dbxenv suppress_startup_message 4.0
 
-function dp_args {
-  dp "*(((Lisp_Object*)($1))+0)"
-  dp "*(((Lisp_Object*)($1))+1)"
-}
-
 function dp_core {
   print ((struct x_frame *)(((struct frame*)(Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget->core
 }