mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-28 10:13:56 +00:00
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:
@@ -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
|
||||
|
||||
38
tests/stdlib/mstackframes.nim
Normal file
38
tests/stdlib/mstackframes.nim
Normal 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()
|
||||
34
tests/stdlib/tstackframes.nim
Normal file
34
tests/stdlib/tstackframes.nim
Normal 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
|
||||
|
||||
"""
|
||||
Reference in New Issue
Block a user