SBCL绕过调试器并打印错误以在其他环境中显示?

Jul*_*not 5 error-handling runtime-error sbcl common-lisp

我通过环境 MaxMSP 的 shell 命令控制 SBCL。

\n\n

通常我的命令是:\nsbcl --core some/path/to/a/.core/file --script my/script/ generated/in/max

\n\n

一切都工作得很好,除非发生错误...\n在这种情况下,我没有得到任何结果,但也无法知道出了什么问题,除了在终端中评估相同的命令(SBCL 调试器显示在终端中)。

\n\n

有没有办法禁用调试器来进行此评估 \xe2\x80\x94 如果遇到错误 \xe2\x80\x94 通常会放弃 \xe2\x80\x94 但随后“回显”错误的实际内容?

\n\n

通常要获取实际的字符串,其内容类似于\n“绑定 SB-KERNEL::X 时,值\n \'TOTO\n 不是类型\n NUMBER\n”,这样我可以直接从 Max 中看到它去航站楼?

\n\n

感谢您的帮助!\n最好,

\n\n

朱利安

\n\n

我尝试在我的命令之上添加 --non-interactive ,它有帮助,但它绝对不是我需要的。

\n\n

似乎我应该以某种方式使用debug-io但我不确定如何访问其内容:(

\n

cor*_*ump 2

您可以尝试使用--disable-debugger

$ echo '(error "Oh no")' > script.lisp 
$ sbcl --disable-debugger --load $PWD/script.lisp 
This is SBCL 1.5.2.33-d415e2949, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
While evaluating the form starting at line 1, column 0
  of #P"/tmp/script.lisp":
Unhandled SIMPLE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                    {10005C85B3}>:
  Oh no

Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {10005C85B3}>
0: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SIMPLE-ERROR "Oh no" {1003643C33}> #<unused argument> :QUIT T)
1: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<SIMPLE-ERROR "Oh no" {1003643C33}>)
2: (INVOKE-DEBUGGER #<SIMPLE-ERROR "Oh no" {1003643C33}>)
3: (ERROR "Oh no")
4: (SB-INT:SIMPLE-EVAL-IN-LEXENV (ERROR "Oh no") #<NULL-LEXENV>)
5: (EVAL-TLF (ERROR "Oh no") 0 NIL)
6: ((LABELS SB-FASL::EVAL-FORM :IN SB-INT:LOAD-AS-SOURCE) (ERROR "Oh no") 0)
7: ((LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) (ERROR "Oh no") :CURRENT-INDEX 0)
8: (SB-C::%DO-FORMS-FROM-INFO #<CLOSURE (LAMBDA (SB-KERNEL:FORM &KEY :CURRENT-INDEX &ALLOW-OTHER-KEYS) :IN SB-INT:LOAD-AS-SOURCE) {10036436CB}> #<SB-C::SOURCE-INFO {1003643683}> SB-C::INPUT-ERROR-IN-LOAD)
9: (SB-INT:LOAD-AS-SOURCE #<SB-INT:FORM-TRACKING-STREAM for "file /tmp/script.lisp" {1003641C13}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading")
10: ((FLET SB-FASL::THUNK :IN LOAD))
11: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<CLOSURE (FLET SB-FASL::THUNK :IN LOAD) {7F13FE6777EB}> #<SB-INT:FORM-TRACKING-STREAM for "file /tmp/script.lisp" {1003641C13}>)
12: ((FLET SB-FASL::LOAD-STREAM :IN LOAD) #<SB-INT:FORM-TRACKING-STREAM for "file /tmp/script.lisp" {1003641C13}> NIL)
13: (LOAD #P"/tmp/script.lisp" :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST T :EXTERNAL-FORMAT :DEFAULT)
14: (SB-IMPL::PROCESS-EVAL/LOAD-OPTIONS ((:LOAD . "/tmp/script.lisp")))
15: (SB-IMPL::TOPLEVEL-INIT)
16: ((FLET SB-UNIX::BODY :IN SAVE-LISP-AND-DIE))
17: ((FLET "WITHOUT-INTERRUPTS-BODY-14" :IN SAVE-LISP-AND-DIE))
18: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))
Run Code Online (Sandbox Code Playgroud)

请注意,打印跟踪,然后程序退出。

或者,您可以设置为进入调试器时调用的自定义函数,例如*DEBUGGER-HOOK*在其中打印错误并调用。(sb-ext:quit)

例如:

(setf *debugger-hook*
      (lambda (condition old-hook)
        (declare (ignore old-hook))
        (format *error-output*
                 "Caught error: ~a"
                 condition)
        (finish-output *error-output*)
        (sb-ext:quit)))
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢在脚本HANDLER-CASE中使用,则代码几乎相同:

(handler-case (...main...)
  (condition (c) ...log and quit..))
Run Code Online (Sandbox Code Playgroud)