.Q.trp[f;x;g]
Where
f is a unary functionx is its argumentg is a binary functionextends Trap (@[f;x;g]) to collect backtrace: g gets called
with arguments:
You can format the backtrace object with .Q.sbt.
q)f:{`hello+x}
q) / print the formatted backtrace and error string to stderr
q).Q.trp[f;2;{2@"error: ",x,"\nbacktrace:\n",.Q.sbt y;-1}]
error: type
backtrace:
[2] f:{`hello+x}
^
[1] (.Q.trp)
[0] .Q.trp[f;2;{2@"error: ",x,"\nbacktrace:\n",.Q.sbt y;-1}]
^
-1
q)
.Q.trp can be used for remote debugging.
q)h:hopen`::5001 / f is defined on the remote
q)h"f `a"
'type / q's IPC protocol can only get the error string back
[0] h"f `a"
^
q) / a made up protocol: (0;result) or (1;backtrace string)
q)h".z.pg:{.Q.trp[(0;)@value@;x;{(1;.Q.sbt y)}]}"
q)h"f 3"
0 / result
,9 9 9
q)h"f `a"
1 / failure
" [4] f@:{x*y}\n ^\n [3..
q)1@(h"f `a")1; / output the backtrace string to stdout
[4] f@:{x*y}
^
[3] f:{{x*y}[x;3#x]}
^
[2] f `a
^
[1] (.Q.trp)
[0] .z.pg:{.Q.trp[(0;)@enlist value@;x;{(1;.Q.sbt y)}]}
^
Since V3.5 2017.03.15.