bug fix TFA>NAMEZ
[rrq/rrqforth.git] / debug.sh
index 5963b303995439741dd0ee558861382388e1e5b4..fd6795b88d75b402a173550376def06d0ac2c688 100755 (executable)
--- a/debug.sh
+++ b/debug.sh
@@ -2,23 +2,50 @@
 
 PFX='0x[0-9a-f]* rrqforth.asm:[0-9]*[ ]*'
 
+
 grep "${PFX}do" rrqforth.map | sed 's/ .*//;s/^/break */' > gdbinit
-NBR=( $(eval "echo {1..$(wc -l < gdbinit)}") )
 
-for I in ${NBR[@]} ; do echo disable $I ; done >> gdbinit
+NBR=$(wc -l < gdbinit)
 
-DS="$(grep "${PFX}DS_TOP:" rrqforth.map | sed 's/ .*//')"
+I=1
+while [ $I -lt $NBR ] ; do echo disable $I ; I=$((I+1)) ; done >> gdbinit
+
+RET=( $(grep -w ret rrqforth.map | sed 's/ .*//') )
+echo "break *${RET[0]}" >> gdbinit
+#      ;; rax = cfa of called word
+#      ;; rsi = cell* of next forth word
+#      ;; [$rsp] = from where the call was
+
+cat <<EOF >> gdbinit
+commands $((NBR+1))
+print (void*) \$rsp
+print (((char*)(*(((void**)\$rax)-2)))+32)
+print (void*) \$rsi
+continue
+end
+EOF
 
+DS="$(grep "${PFX}DS_TOP:" rrqforth.map | sed 's/ .*//')"
+RS="$(grep "${PFX}RS_TOP:" rrqforth.map | sed 's/ .*//')"
 cat <<EOF >> gdbinit
 display *(void**)\$rsp@(((void*)$DS-\$rsp)/8)+1
-display (char*)(*(void**)(\$rax-16)+32)
+display *(void**)\$rbp@(((void*)$RS-\$rbp)/8)+1
 display (void*)\$rax
 display (void*)\$rsi
 
 define si
     stepi
-    x/3i \$pc
-    python gdb.execute("shell ./grepline.sh " + str(gdb.parse_and_eval("\$pc")))
+    x/2i \$pc
+    python gdb.execute("shell ./grepline.sh rrqforth.map " + str(gdb.parse_and_eval("\$pc")))
+end
+
+define map
+    if \$argc == 1
+        python gdb.execute("shell ./grepline.sh rrqforth.map \$arg0" + " 1 " )
+    else
+       python gdb.execute("shell ./grepline.sh rrqforth.map \$arg0" + " 1 " + "\$arg1" )
+    end
+end
 EOF
 
 exec gdb -x gdbinit rrqforth