mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 03:02:31 +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:
30
lib/std/stackframes.nim
Normal file
30
lib/std/stackframes.nim
Normal file
@@ -0,0 +1,30 @@
|
||||
const NimStackTrace = compileOption("stacktrace")
|
||||
const NimStackTraceMsgs = compileOption("stacktraceMsgs")
|
||||
|
||||
template procName*(): string =
|
||||
## returns current C/C++ function name
|
||||
when defined(c) or defined(cpp):
|
||||
var name {.inject.}: cstring
|
||||
{.emit: "`name` = __func__;".}
|
||||
$name
|
||||
|
||||
template getPFrame*(): PFrame =
|
||||
## avoids a function call (unlike `getFrame()`)
|
||||
block:
|
||||
when NimStackTrace:
|
||||
var framePtr {.inject.}: PFrame
|
||||
{.emit: "`framePtr` = &FR_;".}
|
||||
framePtr
|
||||
|
||||
template setFrameMsg*(msg: string, prefix = " ") =
|
||||
## attach a msg to current `PFrame`. This can be called multiple times
|
||||
## in a given PFrame. Noop unless passing --stacktraceMsgs and --stacktrace
|
||||
when NimStackTrace and NimStackTraceMsgs:
|
||||
block:
|
||||
var fr {.inject.}: PFrame
|
||||
{.emit: "`fr` = &FR_;".}
|
||||
# consider setting a custom upper limit on size (analog to stack overflow)
|
||||
frameMsgBuf.setLen fr.frameMsgLen
|
||||
frameMsgBuf.add prefix
|
||||
frameMsgBuf.add msg
|
||||
fr.frameMsgLen += prefix.len + msg.len
|
||||
Reference in New Issue
Block a user