add gdbinit for debugging the vm
authorAndy Wingo <wingo@pobox.com>
Thu, 25 Sep 2008 10:07:52 +0000 (12:07 +0200)
committerAndy Wingo <wingo@pobox.com>
Thu, 25 Sep 2008 10:07:52 +0000 (12:07 +0200)
* gdbinit: Add my gdbinit. The most useful commands are gwrite and
  vmstack.

gdbinit [new file with mode: 0644]

diff --git a/gdbinit b/gdbinit
new file mode 100644 (file)
index 0000000..40c8f62
--- /dev/null
+++ b/gdbinit
@@ -0,0 +1,188 @@
+define newline
+  call (void)scm_newline (scm_current_error_port ())
+end
+
+define gdisplay
+  call (void)scm_display ($arg0, scm_current_error_port ())
+  newline
+end
+
+define gwrite
+  call (void)scm_write ($arg0, scm_current_error_port ())
+  newline
+end
+
+define sputs
+  call (void)scm_puts ($arg0, scm_current_error_port ())
+end
+
+define gslot
+  print ((SCM**)$arg0)[1][$arg1]
+end
+
+define pslot
+  gslot $arg0 $arg1
+  gwrite $
+end
+
+define lforeach
+  set $l=$arg0
+  while $l != 0x404
+    set $x=scm_car($l)
+    $arg1 $x
+    set $l = scm_cdr($l)
+  end
+end
+
+define modsum
+  modname $arg0
+  gslot $arg0 1
+  set $uses=$
+  output "uses:\n"
+  lforeach $uses modname
+end
+
+define moduses
+  pslot $arg0 1
+end
+
+define modname
+  pslot $arg0 5
+end
+
+define modkind
+  pslot $arg0 6
+end
+
+define car
+  call scm_car ($arg0)
+end
+
+define cdr
+  call scm_cdr ($arg0)
+end
+
+define smobwordtox
+  set $x=((SCM*)$arg0)[$arg1]
+end
+
+define smobdatatox
+  smobwordtox $arg0 1
+end
+
+define program
+  smobdatatox $arg0
+  p *(struct scm_program*)$x
+end
+
+define proglocals
+  set $i=bp->nlocs
+  while $i > 0
+    set $i=$i-1
+    gwrite fp[bp->nargs+$i]
+  end
+end
+
+define progstack
+  set $x=sp
+  while $x > stack_base
+    gwrite *$x
+    set $x=$x-1
+  end
+end
+
+define tc16
+  p ((scm_t_bits)$arg0) & 0xffff
+end
+
+define smobdescriptor
+  p scm_smobs[0xff & (((scm_t_bits)$arg0) >> 8)]
+end
+
+define vmstack
+  set $vmsp=sp
+  set $vmstack_base=stack_base
+  set $vmfp=fp
+  set $vmbp=bp
+  set $vmframe=0
+  while $vmsp > vp->stack_base
+    set $orig_vmsp=$vmsp
+    while $vmsp > $vmstack_base
+      output $orig_vmsp - $vmsp
+      sputs "\t"
+      output $vmsp
+      sputs "\t"
+      gwrite *$vmsp
+      set $vmsp=$vmsp-1
+    end
+    newline
+    sputs "Frame "
+    output $vmframe
+    newline
+    sputs "ra:\t"
+    output $vmsp
+    sputs "\t"
+    output (SCM*)*$vmsp
+    set $vmsp=$vmsp-1
+    newline
+    sputs "mvra:\t"
+    output $vmsp
+    sputs "\t"
+    output (SCM*)*$vmsp
+    set $vmsp=$vmsp-1
+    newline
+    sputs "dl:\t"
+    output $vmsp
+    sputs "\t"
+    set $vmdl=(SCM*)(*$vmsp)
+    output $vmdl
+    newline
+    set $vmsp=$vmsp-1
+    sputs "hl:\t"
+    output $vmsp
+    sputs "\t"
+    gwrite *$vmsp
+    set $vmsp=$vmsp-1
+    sputs "el:\t"
+    output $vmsp
+    sputs "\t"
+    gwrite *$vmsp
+    set $vmsp=$vmsp-1
+    set $vmnlocs=(int)$vmbp->nlocs
+    while $vmnlocs > 0
+      sputs "loc #"
+      output $vmnlocs
+      sputs ":\t"
+      output $vmsp
+      sputs "\t"
+      gwrite *$vmsp
+      set $vmsp=$vmsp-1
+      set $vmnlocs=$vmnlocs-1
+    end
+    set $vmnargs=(int)$vmbp->nargs
+    while $vmnargs > 0
+      sputs "arg #"
+      output $vmnargs
+      sputs ":\t"
+      output $vmsp
+      sputs "\t"
+      gwrite *$vmsp
+      set $vmsp=$vmsp-1
+      set $vmnargs=$vmnargs-1
+    end
+    sputs "prog:\t"
+    output $vmsp
+    sputs "\t"
+    gwrite *$vmsp
+    set $vmsp=$vmsp-1
+    newline
+    if !$vmdl
+      loop_break
+    end
+    set $vmfp=$vmdl
+    set $vmbp=(struct scm_program*)(((SCM*)($vmfp[-1]))[1])
+    set $vmstack_base=$vmfp+$vmbp->nargs+$vmbp->nlocs+4
+    set $vmframe=$vmframe+1
+    newline
+  end
+end