mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-20 22:35:24 +00:00
Show only detailed async tracebacks.
This commit is contained in:
committed by
Andreas Rumpf
parent
391f877e6c
commit
6301e33543
@@ -225,7 +225,7 @@ proc diff[T](a, b: seq[T]): (int, seq[T]) =
|
||||
## .. code-block::nim
|
||||
## doAssert(diff(@[1,2,42,123], @[1,2,123,678,21]) == (1, @[123,678,21]))
|
||||
var lastIndex = 0
|
||||
for i in 0 .. <min(a.len, b.len):
|
||||
for i in 0..<min(a.len, b.len):
|
||||
lastIndex = i
|
||||
if a[i] != b[i]:
|
||||
break
|
||||
@@ -259,62 +259,6 @@ proc mergeEntries(entries: seq[StackTraceEntry]): seq[StackTraceEntry] =
|
||||
result.add(entry)
|
||||
i.inc
|
||||
|
||||
proc shortenEntries(entries: seq[StackTraceEntry]): seq[StackTraceEntry] =
|
||||
## Analyzes the entries for patterns and processes them.
|
||||
proc get(entries: seq[StackTraceEntry], i: int): StackTraceEntry =
|
||||
if i >= entries.len:
|
||||
return StackTraceEntry(procName: "", line: 0, filename: "")
|
||||
else:
|
||||
return entries[i]
|
||||
|
||||
result = @[]
|
||||
var i = 0
|
||||
while i < entries.len:
|
||||
var entry = entries[i]
|
||||
|
||||
# Detect this pattern:
|
||||
# (procname: a, line: 393, filename: asyncmacro.nim)
|
||||
# ...
|
||||
# (procname: a_continue, line: 34, filename: asyncmacro.nim)
|
||||
# ...
|
||||
# (procname: aIter, line: 40, filename: tasync_traceback.nim)
|
||||
proc searchBackwards(entries: seq[StackTraceEntry],
|
||||
current: StackTraceEntry): (int, StackTraceEntry) =
|
||||
# Search backwards for the beginning of the pattern.
|
||||
result[0] = 0
|
||||
if not ($current.procName).normalize().endsWith("iter"):
|
||||
return
|
||||
|
||||
# Find (procname: a, line: 393, filename: asyncmacro.nim)
|
||||
let start = entries.len-1
|
||||
var counter = start
|
||||
while counter >= 0:
|
||||
if cmpIgnoreStyle($entries[counter].procName & "iter",
|
||||
$current.procName) == 0:
|
||||
break
|
||||
counter.dec()
|
||||
|
||||
# Return when no beginning of pattern is found.
|
||||
if counter < 0:
|
||||
return
|
||||
|
||||
result[0] = start - counter
|
||||
result[1] = StackTraceEntry(
|
||||
procName: entries[result[0]].procName,
|
||||
line: current.line,
|
||||
filename: current.filename
|
||||
)
|
||||
|
||||
let (itemsToRemove, newEntry) = searchBackwards(result, entry)
|
||||
|
||||
if itemsToRemove != 0:
|
||||
entry = newEntry
|
||||
# Remove the previous entries.
|
||||
result.setLen(result.len-itemsToRemove)
|
||||
|
||||
result.add(entry)
|
||||
i.inc
|
||||
|
||||
proc getHint(entry: StackTraceEntry): string =
|
||||
## We try to provide some hints about stack trace entries that the user
|
||||
## may not be familiar with, in particular calls inside the stdlib.
|
||||
@@ -372,11 +316,7 @@ proc injectStacktrace[T](future: Future[T]) =
|
||||
var newMsg = exceptionMsg & header
|
||||
|
||||
let entries = getStackTraceEntries(future.error).mergeEntries()
|
||||
let shortEntries = entries.shortenEntries()
|
||||
newMsg.add($shortEntries)
|
||||
if entries.len > shortEntries.len:
|
||||
newMsg.add("\nDetailed Async traceback:\n")
|
||||
newMsg.add($entries)
|
||||
newMsg.add($entries)
|
||||
|
||||
newMsg.add("Exception message: " & exceptionMsg & "\n")
|
||||
newMsg.add("Exception type:")
|
||||
|
||||
@@ -4,35 +4,42 @@ discard """
|
||||
output: '''
|
||||
b failure
|
||||
Async traceback:
|
||||
tasync_traceback.nim(75) tasync_traceback
|
||||
tasync_traceback.nim(83) tasync_traceback
|
||||
asyncmacro.nim(393) a
|
||||
asyncmacro.nim(43) cb0
|
||||
asyncmacro.nim(43) a_continue
|
||||
└─Resumes an async procedure
|
||||
asyncfutures.nim(211) callback=
|
||||
asyncfutures.nim(190) addCallback
|
||||
asyncfutures.nim(53) callSoon
|
||||
asyncmacro.nim(34) cb0
|
||||
asyncmacro.nim(34) a_continue
|
||||
└─Resumes an async procedure
|
||||
asyncmacro.nim(0) aIter
|
||||
asyncfutures.nim(355) read
|
||||
tasync_traceback.nim(73) a
|
||||
tasync_traceback.nim(70) b
|
||||
asyncfutures.nim(340) read
|
||||
asyncmacro.nim(34) a_continue
|
||||
└─Resumes an async procedure
|
||||
tasync_traceback.nim(81) aIter
|
||||
asyncmacro.nim(393) b
|
||||
asyncmacro.nim(34) b_continue
|
||||
└─Resumes an async procedure
|
||||
tasync_traceback.nim(78) bIter
|
||||
Exception message: b failure
|
||||
Exception type:
|
||||
|
||||
bar failure
|
||||
Async traceback:
|
||||
tasync_traceback.nim(91) tasync_traceback
|
||||
tasync_traceback.nim(99) tasync_traceback
|
||||
asyncdispatch.nim(1204) waitFor
|
||||
asyncdispatch.nim(1253) poll
|
||||
└─Processes asynchronous completion events
|
||||
asyncdispatch.nim(181) processPendingCallbacks
|
||||
└─Executes pending callbacks
|
||||
asyncmacro.nim(34) cb0
|
||||
asyncmacro.nim(34) foo_continue
|
||||
└─Resumes an async procedure
|
||||
asyncmacro.nim(0) fooIter
|
||||
asyncfutures.nim(355) read
|
||||
tasync_traceback.nim(86) barIter
|
||||
asyncfutures.nim(340) read
|
||||
asyncmacro.nim(34) bar_continue
|
||||
└─Resumes an async procedure
|
||||
tasync_traceback.nim(94) barIter
|
||||
Exception message: bar failure
|
||||
Exception type:'''
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user