Cha*_*rJe 0 debugging emacs common-lisp slime
每当我遇到错误时,Sly 都会显示重新启动和回溯。我在互联网上看到有人拥有可读的回溯,这些回溯是合理的函数调用。当我进入(fun duf)
repl 时,我最终会得到这样的结果:
Backtrace:
0: ((LAMBDA ()))
1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (FUN DUF) #<NULL-LEXENV>)
2: (EVAL (FUN DUF))
3: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1))
4: (SLYNK::CALL-WITH-RETRY-RESTART "Retry SLY mREPL evaluation request." #<CLOSURE (LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1) {100308AA1B}>)
5: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1))
6: ((LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER))
7: (SLYNK::CALL-WITH-BINDINGS ((*PACKAGE* . #<PACKAGE "COMMON-LISP-USER">) (* . 13) (** . 10) (***) (/ 13) (// 10) ...) #<CLOSURE (LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER) {100308A68B}>)
8: (SLYNK-MREPL::MREPL-EVAL-1 #<SLYNK-MREPL::MREPL mrepl-2-2> "(fun duf)")
9: (SLYNK-MREPL::MREPL-EVAL #<SLYNK-MREPL::MREPL mrepl-2-2> "(fun duf)")
...
Run Code Online (Sandbox Code Playgroud)
还有很多。这使我无法调试我的代码。我试过:(declaim (optimize (debug 3)))
,但没有区别。此外,即使调用是实际函数,输出也不会更好。我已经尝试过 gnuclisp 和 sbcl。
我认为你觉得你看到的很多东西都是“垃圾”,只是因为你还不知道它是什么。
*
to***
绑定到最后的结果(REPL 的一个方便的功能)。call-with-listener
可能正在确定输出应该转到 Sly。retry
重新启动已建立。如果您Retry
在调试器中调用重新启动,则此帧将转移控制权。call-with-…
命名约定。eval
。eval
s 实现。这里没什么可看的,因为首先要做的eval
是评估duf
,但它失败了。
计算机不知道您正在尝试调试当前堆栈上下文的哪一部分。因此,它必须向您显示整个回溯,否则会遭受那些隐瞒他们感兴趣的信息的人的哀号。
你需要学习的是识别你感兴趣的东西从哪里开始。在这里,所有 Slynk 的东西(显然?)都在你的上下文之下,所以你真的只需要查看第一eval
行之前的部分。在这种情况下,这只是第一行,这是有道理的,因为您输入的行在第一次查找时就失败了。对于 Sly 开发人员来说,那些较低的堆栈帧可能会很有趣。
当然,在更现实的场景中,有些实现比其他实现具有更清晰的回溯。这不是 Sly 可以做的事情。它的作用是让您可以选择从回溯中的任何一行跳转到相应的源文件位置(如果可用)(在 SLIME 中,它是v
(视图),不知道 Sly)。您还可以做很多事情,例如检查本地绑定/变量/参数,以及调用重新启动。看一下说明书。
归档时间: |
|
查看次数: |
124 次 |
最近记录: |