From feaa3640387fdfb2929cc2d99f18db804ffe1cee Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 5 Dec 2025 14:52:35 +0800 Subject: [PATCH] fixes #25306; Dangling pointers in stack traces with `-d:nimStackTraceOverride` (#25313) 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 0ea5f2625cc9015eb45fb0667370940514e9aed8) --- lib/system/stacktraces.nim | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/system/stacktraces.nim b/lib/system/stacktraces.nim index 7c8ab83c48..cdb24eaedf 100644 --- a/lib/system/stacktraces.nim +++ b/lib/system/stacktraces.nim @@ -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.. 0: - result.add(stackTraceOverrideGetDebuggingInfo(programCounters, maxStackTraceLines)) + result.addStackTraceEntrySeq(stackTraceOverrideGetDebuggingInfo(programCounters, maxStackTraceLines))