stacktraces can now show custom runtime msgs per frame (#13351)

* stacktraces can now show custom runtime msgs
* improve tests/stdlib/tstackframes.nim
* fix test for --gc:arc
* test --stacktraceMsgs:on and --stacktraceMsgs:off
* --stacktracemsgs:off by default
This commit is contained in:
Timothee Cour
2020-03-30 04:45:32 -07:00
committed by GitHub
parent 8088633250
commit 19cab9fa51
14 changed files with 171 additions and 21 deletions

View File

@@ -36,4 +36,4 @@ try:
except AssertionError:
let e = getCurrentException()
let trace = e.getStackTrace
echo tmatch(trace, expected)
if tmatch(trace, expected): echo true else: echo "wrong trace:\n" & trace

View File

@@ -0,0 +1,38 @@
import std/stackframes
# line 5
var count = 0
proc main1(n: int) =
setFrameMsg $("main1", n)
if n > 0:
main1(n-1)
proc main2(n: int) =
count.inc
setFrameMsg $("main2", n, count)
proc bar() =
setFrameMsg $("bar ",)
if n < 3: raise newException(CatchableError, "on purpose")
bar()
main2(n-1)
proc main() =
var z = 0
setFrameMsg "\n z: " & $z, prefix = ""
# multiple calls inside a frame are possible
z.inc
setFrameMsg "\n z: " & $z, prefix = ""
try:
main2(5)
except CatchableError:
main1(10) # goes deep and then unwinds; sanity check to ensure `setFrameMsg` from inside
# `main1` won't invalidate the stacktrace; if StackTraceEntry.frameMsg
# were a reference instead of a copy, this would fail.
let e = getCurrentException()
let trace = e.getStackTrace
echo trace
main()

View File

@@ -0,0 +1,34 @@
import std/[strformat,os,osproc]
import "$nim/compiler/unittest_light" # works even if moved by megatest
proc main(opt: string, expected: string) =
const nim = getCurrentCompilerExe()
const file = currentSourcePath().parentDir / "mstackframes.nim"
let cmd = fmt"{nim} c -r --excessiveStackTrace:off --stacktraceMsgs:{opt} --hints:off {file}"
let (output, exitCode) = execCmdEx(cmd)
assertEquals output, expected
doAssert exitCode == 0
main("on"): """
mstackframes.nim(38) mstackframes
mstackframes.nim(29) main
z: 0
z: 1
mstackframes.nim(20) main2 ("main2", 5, 1)
mstackframes.nim(20) main2 ("main2", 4, 2)
mstackframes.nim(20) main2 ("main2", 3, 3)
mstackframes.nim(19) main2 ("main2", 2, 4)
mstackframes.nim(18) bar ("bar ",)
"""
main("off"): """
mstackframes.nim(38) mstackframes
mstackframes.nim(29) main
mstackframes.nim(20) main2
mstackframes.nim(20) main2
mstackframes.nim(20) main2
mstackframes.nim(19) main2
mstackframes.nim(18) bar
"""