Debugging 如何使SBCL在任何条件/错误下调用调试器?

Debugging 如何使SBCL在任何条件/错误下调用调试器?,debugging,common-lisp,sbcl,Debugging,Common Lisp,Sbcl,例如,当SBCL说 值NIL不是CONS类型 我想中断执行并在出错时调用调试器 现在它会一直冒泡到调用方(在我的例子中是Wookie async web服务器),在那里它只是由默认的错误处理函数报告。在上述函数中调用(break)会调用调试器,但会使用Wookie的调用堆栈 我也许能帮你回答你的问题。有两种可能的情况正在发生。一个是你开始了你的事件循环 (with-event-loop (:catch-app-errors t) ...) 这本质上告诉cl-async,您希望它捕获任何未处理的

例如,当SBCL说

值NIL不是CONS类型

我想中断执行并在出错时调用调试器


现在它会一直冒泡到调用方(在我的例子中是Wookie async web服务器),在那里它只是由默认的错误处理函数报告。在上述函数中调用(break)会调用调试器,但会使用Wookie的调用堆栈

我也许能帮你回答你的问题。有两种可能的情况正在发生。一个是你开始了你的事件循环

(with-event-loop (:catch-app-errors t) ...)
这本质上告诉cl-async,您希望它捕获任何未处理的错误,并为它们运行默认事件处理程序。默认的错误处理程序对so调用(错误事件)说“这是一个实际的错误吗?”,这使得您的错误看起来是来自cl async的顶层。这背后的目的是,您可以编写自己的错误处理程序来捕获您认为合适的内容

可能发生的第二件事是,您正在使用cl async的futures,它还通过将错误包装在自己的错误处理中来混淆错误。这使得可以通过宏进行异步词汇错误处理

因此,如果您遇到错误并且不知道在哪里,请执行以下操作:

;; do this *before* loading cl-async-future. this turns off ALL error capturing for
;; futures, letting your errors bubble up to top level without interference
(push :future-debug *features*)

;; ... load cl-async / wookie ...

;; tell cl-async not to catch errors
(cl-async:with-event-loop (:catch-app-errors nil) ...)
现在,当您得到一个错误时,它应该会冒泡到REPL,您将能够确切地看到它来自何处。有一些方法(至少使用futures)可以获得异步函数内部发生的错误的临时回溯,但这超出了答案的范围,并且假设您甚至首先使用futures(尽管Wookie确实使用了futures)


希望有帮助

你已经读过了吗?看来这可能对你的问题有帮助。是的,就是这样。但奇怪的是,堆栈仍然不包括导致错误的帧。顶部框架是Wookie自己的事件处理程序。不过这只是个开始。谢谢。@明亚,如果这个链接提供了一个对你有用的解决方案,你应该考虑把你的解决方案写为答案并把它标记为接受。好吧,我想它损坏了一半,我准备接受,但是无论如何,解决方案是@ R Ord的,不是吗?谢谢你的一个伟大的解释;但是,如果我这样做,Wookie会在我模仿Turtle的预路由身份验证处理程序(这是我唯一明确使用futures的地方)中发出错误条件的信号。我不确定这是否表明了一个实际的错误,而不是我没有按照你的指示去做。。。因为当我对实际请求进行测试时,处理程序工作正常。