A few years ago I made some bug fixes to Peter's Verhas's experimental sdbg remote Script BASIC debugger. I wrote my own console client in SB which works great. I plan on using some of Dave Zimmer's enhancements to his VB/COM IDE/Debugger preprocessor project to view array contents and trace the call stack. The remote socket based Script BASIC debugger works with both local desktop scripts and remote sbhttpd proxy server web applications.
dbgcon.sb
' ScriptBasic Remote Console Debugger
cmdln = TRIM(COMMAND())
IF cmdln = "" THEN
PRINT "Usage: dbgcon [prog2debug]\n"
END
END IF
exitcode = EXECUTE("/usr/bin/scriba -i sdbg " & cmdln,-1,PID)
OPEN "127.0.0.1:6647" FOR SOCKET AS #1
WHILE NOT EOF(1)
LINE INPUT #1, dbgs
IF dbgs = ".\n" THEN
PRINT "-> "
LINE INPUT dbgc
IF LCASE(CHOMP(dbgc)) = "h" THEN
PRINT """h help
s step one line
S step one line, do not step into functions or subs
o step until getting out of the current function
(if you stepped into but changed your mind)
? var print the value of a variable
u step one level up in the stack
d step one level down in the stack (for variable printing)
D step down in the stack to current execution depth
G list all global variables
L list all local variables
l [n-m] list the source lines
r [n] run to line n
R [n] run to line n but do not stop in recursive function call
b [n] set breakpoint on the line n or the current line
B [n-m] remove breakpoints from lines
q quit the program
"""
END IF
PRINT #1, dbgc
IF CHOMP(dbgc) = "q" THEN GOTO Done
ELSE
dbgcmd = CHOMP(dbgs)
' l - List Source
IF INSTR(dbgcmd,"Break-Point: ")<>undef THEN
p = INSTR(dbgcmd,"Break-Point: ")
IF MID(dbgcmd,p+13,1) = "0" THEN
PRINT " "
ELSE
PRINT "*"
END IF
GOTO IT
END IF
IF INSTR(dbgcmd,"Line-Number: ")<>undef THEN
p = INSTR(dbgcmd,"Line-Number: ")
PRINT FORMAT("%~[0000] ~",VAL(MID(dbgcmd,p+13)))
online = TRUE
GOTO IT
END IF
IF INSTR(dbgcmd,"Line: ")<>undef THEN
p = INSTR(dbgcmd,"Line: ")
IF online THEN
PRINT MID(dbgcmd,p+6),"\n"
ELSE
PRINT MID(dbgcmd,p),"\n"
END IF
online = FALSE
GOTO IT
END IF
IF INSTR(dbgcmd,"Global-Variable")<>undef THEN
p = INSTR(dbgcmd,"Global-Variable")
PRINT "G-Var" & MID(dbgcmd,p+15) & "\n"
GOTO IT
END IF
' Unprocessed out
PRINT dbgs
END IF
IT:
WEND
Done:
PRINT #1,"q"
CLOSE(1)
PRINT "Debug session closed.\n"
END
testarray.sb
' Long / Double / String
i = 1
d = .99
s = "JRS"
' Indices array
a[0,0] = 0
a[0,1] = 123
a[0,2] = 1.23
a[0,3] = "One,Two,Three"
a[1,10] = "Zero"
a[1,11] = 321
a[1,12] = 32.1
a[1,13] = "Three,Two,One"
' Asscociative array
b{"One"} = 1
b{"Two"} = .2
b{"Three"} = "*3*"
' Mix asscociative & indices array
c{"JRS"}[1] = 1
c{"JRS"}[2] = .2
c{"JRS"}[3] = "*3*"
PRINT "Done\n"
Output
jrs@laptop:~/sb/sb22/sbt$ scriba dbgcon.sb testarray.sb
Application: ScriptBasic Remote Debugger - Linux
Version: 1.0
Source-File-Count: 1
Source-File: testarray.sb
Line: 2
-> b15
Message: done
Line: 2
-> l1-
[0001] ' Long / Double / String
[0002] i = 1
[0003] d = .99
[0004] s = "JRS"
[0005] ' Indices array
[0006] a[0,0] = 0
[0007] a[0,1] = 123
[0008] a[0,2] = 1.23
[0009] a[0,3] = "One,Two,Three"
[0010] a[1,10] = "Zero"
[0011] a[1,11] = 321
[0012] a[1,12] = 32.1
[0013] a[1,13] = "Three,Two,One"
[0014] ' Asscociative array
*[0015] b{"One"} = 1
[0016] b{"Two"} = .2
[0017] b{"Three"} = "*3*"
[0018] ' Mix asscociative & indices array
[0019] c{"JRS"}[1] = 1
[0020] c{"JRS"}[2] = .2
[0021] c{"JRS"}[3] = "*3*"
[0022] PRINT "Done\n"
Line: 2
-> r
Line: 15
-> r22
Line: 22
-> G
G-Var-Name: VT=0 @ 0x014BBD18 VN=main::i
G-Var-Value: 1
G-Var-Name: VT=1 @ 0x014C9258 VN=main::d
G-Var-Value: 0.990000
G-Var-Name: VT=2 @ 0x014C92B8 VN=main::s
G-Var-Value: "JRS"
G-Var-Name: VT=3 @ 0x014C9378 LB=0 : UB=1 VN=main::a
G-Var-Value:
LB=0 : UB=3 VN=[0]
[0] VT=3 @ 0x014C9468
[0] VT=0 @ 0x014C9558 0
[1] VT=0 @ 0x014C96D8 123
[2] VT=1 @ 0x014C9898 1.230000
[3] VT=2 @ 0x014BC0A8 "One,Two,Three"
LB=10 : UB=13 VN=[1]
[1] VT=3 @ 0x014BC1C8
[10] VT=2 @ 0x014BC228 "Zero"
[11] VT=0 @ 0x014BC3A8 321
[12] VT=1 @ 0x014BC568 32.100000
[13] VT=2 @ 0x014BC6D8 "Three,Two,One"
G-Var-Name: VT=3 @ 0x014BC798 LB=0 : UB=5 VN=main::b
G-Var-Value:
[0] VT=2 @ 0x014BC7F8 "One"
[1] VT=0 @ 0x014BC8B8 1
[2] VT=2 @ 0x014BC968 "Two"
[3] VT=1 @ 0x014BCA28 0.200000
[4] VT=2 @ 0x014BCAE8 "Three"
[5] VT=2 @ 0x014BCB48 "*3*"
G-Var-Name: VT=3 @ 0x014BCBA8 LB=0 : UB=1 VN=main::c
G-Var-Value:
[0] VT=2 @ 0x014BCC08 "JRS"
LB=1 : UB=3 VN=[1]
[1] VT=3 @ 0x014BCCC8
[1] VT=0 @ 0x014BCD88 1
[2] VT=1 @ 0x014BCEA8 0.200000
[3] VT=2 @ 0x014BD5C8 "*3*"
Line: 22
-> ?s
Value: "JRS"
Line: 22
-> ?b
Value:
[0] VT=2 @ 0x014BC7F8 "One"
[1] VT=0 @ 0x014BC8B8 1
[2] VT=2 @ 0x014BC968 "Two"
[3] VT=1 @ 0x014BCA28 0.200000
[4] VT=2 @ 0x014BCAE8 "Three"
[5] VT=2 @ 0x014BCB48 "*3*"
Line: 22
-> r
Done
Debug session closed.
jrs@laptop:~/sb/sb22/sbt$