Подавление некоторых выходных данных отладчика SBCL при разрыве - PullRequest
3 голосов
/ 12 февраля 2020

Отладчик может быть запущен программным способом путем выполнения (break). Например, баннер отладки затем отображает причину прерывания, строку HELP, доступные перезапуски, некоторую связанную информацию и, наконец, источник прерывания:

debugger invoked on a SIMPLE-CONDITION in thread
#<THREAD "main thread" RUNNING {10010B0523}>:
  break

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE] Return from BREAK.
  1: [ABORT   ] Exit debugger, returning to top level.

#(
NODE: STATE=<NIL NIL NIL 0.0 0.0
(         )> DEPTH=0)
#(
NODE: STATE=<NIL NIL NIL 0.0 0.0
((ACTIVE GATE1) (ACTIVE GATE2) (COLOR RECEIVER1 BLUE) (COLOR RECEIVER2 RED) (COLOR TRANSMITTER1 BLUE) (COLOR TRANSMITTER2 RED) (FREE ME) (LOC CONNECTOR1 AREA5) (LOC CONNECTOR2 AREA7) (LOC ME AREA5))> DEPTH=0)
(DF-BNB1 )
   source: (BREAK)
0]

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

1 Ответ

1 голос
/ 18 февраля 2020

Вывод, который вас смущает, связан с местом в коде, где был вызван break. Когда я вызываю его из ванильного Lisp REPL (без SLIME), он отображает:

(SB-INT:SIMPLE-EVAL-IN-LEXENV (BREAK) #<NULL-LEXENV>)

Однако, если я делаю что-то не так в отладчике, вот что происходит:

0] q
; in: PROGN (PRINT 1)
;     (PROGN Q)
; 
; caught WARNING:
;   undefined variable: COMMON-LISP-USER::Q
; 
; compilation unit finished
;   Undefined variable:
;     Q
;   caught 1 WARNING condition

debugger invoked on a UNBOUND-VARIABLE in thread
#<THREAD "main thread" RUNNING {10005204C3}>:
  The variable Q is unbound.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE   ] Retry using Q.
  1: [USE-VALUE  ] Use specified value.
  2: [STORE-VALUE] Set specified value and use it.
  3: [ABORT      ] Reduce debugger level (to debug level 1).
  4:               Return from BREAK.
  5:               Exit debugger, returning to top level.

((LAMBDA (#:G498)) #<unused argument>)
   source: (PROGN Q)

Вы можете видеть, что последняя строка напоминает вывод, который вы получили со строкой, начинающейся с source:. На самом деле вывод, который мы видели, состоит из 3 основных частей: 1. Описание условия 2. Перечень доступных перезапусков 3. Приглашение отладки REPL, напечатанное как debug-loop-fun

Последний вывод является частью приглашения и он генерируется вызовом:

(print-frame-call *current-frame* *debug-io* :print-frame-source t)

Итак, вы можете перекомпилировать вызов, предоставив :print-frame-source nil или попытаться понять, почему ваш текущий кадр выглядит так ...

...