The stacktrace returned by an async program compiled with arc/orc is different than one compiled with refc. Most importantly, the stacktrace with arc/orc gives little help in finding out where the problem is.
Example
import std/[asyncdispatch]
proc async4 {.async.} =
debugEcho "async4"
await sleepAsync(1000)
raise newException(Exception, "Fooo")
proc async3 {.async.} =
debugEcho "async3"
await sleepAsync(1000)
await async4()
proc async2 {.async.} =
debugEcho "async2"
await sleepAsync(1000)
await async3()
proc async1 {.async.} =
debugEcho "async1"
await sleepAsync(1000)
await async2()
proc firstTrampoline {.async.} =
debugEcho "firstTrampoline"
await async1()
waitFor firstTrampoline()
Output with arc/orc
you can see that there's no hint that the problem happened in async4. The only info is the first async trampoline proc and the exception itself.
firstTrampoline
async1
async2
async3
async4
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1937) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
Error: unhandled exception: Fooo
Async traceback:
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) firstTrampolineNimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) firstTrampolineIter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
Exception message: Fooo
[Exception]
Error: execution of an external program failed: '/home/arkanoid/nim/experiments/asyncexceptions '
Output with refc
firstTrampoline
async1
async2
async3
async4
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async4NimAsyncContinue
/home/arkanoid/nim/experiments/asyncexceptions.nim(6) async4Iter
[[reraised from:
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async3NimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) async3Iter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]]
[[reraised from:
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async2NimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) async2Iter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]]
[[reraised from:
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async1NimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) async1Iter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]]
[[reraised from:
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) firstTrampolineNimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) firstTrampolineIter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]]
[[reraised from:
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1937) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]]
Error: unhandled exception: Fooo
Async traceback:
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async4NimAsyncContinue
/home/arkanoid/nim/experiments/asyncexceptions.nim(6) async4Iter
#[
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async3NimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) async3Iter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]#
#[
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async2NimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) async2Iter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]#
#[
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) async1NimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) async1Iter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]#
#[
/home/arkanoid/nim/experiments/asyncexceptions.nim(27) asyncexceptions
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1935) waitFor
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1627) poll
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(1368) runOnce
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncdispatch.nim(208) processPendingCallbacks
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(29) firstTrampolineNimAsyncContinue
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncmacro.nim(145) firstTrampolineIter
/home/arkanoid/.choosenim/toolchains/nim-1.4.8/lib/pure/asyncfutures.nim(390) read
]#
Exception message: Fooo
[Exception]
Error: execution of an external program failed: '/home/arkanoid/nim/experiments/asyncexceptions '
$ nim -v
Nim Compiler Version 1.4.8 [Linux: amd64]
Compiled at 2021-05-25
Copyright (c) 2006-2021 by Andreas Rumpf
git hash: 44e653a9314e1b8503f0fa4a8a34c3380b26fff3
active boot switches: -d:release
Is there anything I can do? I only see two options here: