Вопрос:

Отладчик обхода SBCL и ошибка печати для отображения в другой среде?

error-handling runtime-error common-lisp sbcl

27 просмотра

1 ответ

41 Репутация автора

Я управляю SBCL через команды оболочки со средой MaxMSP.

Обычно мои команды: sbcl --core some / path / to / a / .core / file --script my / script /genaged / in / max

Все прекрасно работает, за исключением случаев, когда возникают ошибки ... В этом случае я не получаю никакого результата, но также не могу узнать, что пошло не так, кроме оценки той же команды в Терминале, где появляется отладчик SBCL.

Есть ли способ просто отключить отладчик для этой оценки - обычно отказаться, если вы столкнулись с ошибкой, - но затем «повторить» фактическое содержание ошибки?

Как правило, чтобы получить фактическую строку, которая говорит что-то вроде "Значение 'TOTO не имеет типа NUMBER при связывании SB-KERNEL :: X", так что я могу видеть это непосредственно от Макса при переходе на терминал?

Спасибо за вашу помощь ! Лучший,

Julien

Я попытался добавить --non-interactive поверх моей команды, это помогает, но это определенно не то, что мне нужно.

Кажется, я должен как-то работать с debug-io, но я не уверен, как получить доступ к его содержимому :(

Автор: Julien Vincenot Источник Размещён: 12.06.2019 03:24

Ответы (1)


1 плюс

23751 Репутация автора

Вы можете попробовать использовать --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))

Обратите внимание, что трассировка распечатывается, а затем программа завершается.

В качестве альтернативы, вы можете установить *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)))

Код почти такой же, если вы предпочитаете использовать его HANDLER-CASEвнутри скрипта :

(handler-case (...main...)
  (condition (c) ...log and quit..))
Автор: coredump Размещён: 12.06.2019 09:53
Вопросы из категории :
32x32