mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
fixes #25306
```nim
type
StackTraceEntry* = object ## In debug mode exceptions store the stack trace that led
## to them. A `StackTraceEntry` is a single entry of the
## stack trace.
procname*: cstring ## Name of the proc that is currently executing.
line*: int ## Line number of the proc that is currently executing.
filename*: cstring ## Filename of the proc that is currently executing.
when NimStackTraceMsgs:
frameMsg*: string ## When a stacktrace is generated in a given frame and
## rendered at a later time, we should ensure the stacktrace
## data isn't invalidated; any pointer into PFrame is
## subject to being invalidated so shouldn't be stored.
when defined(nimStackTraceOverride):
programCounter*: uint ## Program counter - will be used to get the rest of the info,
## when `$` is called on this type. We can't use
## "cuintptr_t" in here.
procnameStr*, filenameStr*: string ## GC-ed alternatives to "procname" and "filename"
```
(cherry picked from commit 0ea5f2625c)
This commit is contained in:
@@ -29,6 +29,8 @@ when defined(nimStackTraceOverride):
|
||||
proc (programCounters: seq[cuintptr_t], maxLength: cint): seq[StackTraceEntry] {.
|
||||
nimcall, gcsafe, raises: [], tags: [], noinline.}
|
||||
|
||||
|
||||
|
||||
# Default procedures (not normally used, because people opting in on this
|
||||
# override are supposed to register their own versions).
|
||||
var
|
||||
@@ -65,6 +67,15 @@ when defined(nimStackTraceOverride):
|
||||
for i in 0..<programCounters.len:
|
||||
s.add(StackTraceEntry(programCounter: cast[uint](programCounters[i])))
|
||||
|
||||
proc patchStackTraceEntry(x: var StackTraceEntry) =
|
||||
x.procname = x.procnameStr.cstring
|
||||
x.filename = x.filenameStr.cstring
|
||||
|
||||
proc addStackTraceEntrySeq(result: var seq[StackTraceEntry]; s: seq[StackTraceEntry]) =
|
||||
for i in 0..<s.len:
|
||||
result.add(s[i])
|
||||
patchStackTraceEntry(result[result.high])
|
||||
|
||||
# We may have more stack trace lines in the output, due to inlined procedures.
|
||||
proc addDebuggingInfo*(s: seq[StackTraceEntry]): seq[StackTraceEntry] =
|
||||
var programCounters: seq[cuintptr_t]
|
||||
@@ -75,10 +86,12 @@ when defined(nimStackTraceOverride):
|
||||
if entry.procname.isNil and entry.programCounter != 0:
|
||||
programCounters.add(cast[cuintptr_t](entry.programCounter))
|
||||
elif entry.procname.isNil and (entry.line == reraisedFromBegin or entry.line == reraisedFromEnd):
|
||||
result.add(stackTraceOverrideGetDebuggingInfo(programCounters, maxStackTraceLines))
|
||||
result.addStackTraceEntrySeq(stackTraceOverrideGetDebuggingInfo(programCounters, maxStackTraceLines))
|
||||
programCounters = @[]
|
||||
result.add(entry[])
|
||||
patchStackTraceEntry(result[result.high])
|
||||
else:
|
||||
result.add(entry[])
|
||||
patchStackTraceEntry(result[result.high])
|
||||
if programCounters.len > 0:
|
||||
result.add(stackTraceOverrideGetDebuggingInfo(programCounters, maxStackTraceLines))
|
||||
result.addStackTraceEntrySeq(stackTraceOverrideGetDebuggingInfo(programCounters, maxStackTraceLines))
|
||||
|
||||
Reference in New Issue
Block a user