Debugging 在中断时抑制某些SBCL调试器输出

Debugging 在中断时抑制某些SBCL调试器输出,debugging,common-lisp,sbcl,Debugging,Common Lisp,Sbcl,可以通过执行(break)以编程方式调用调试器。例如,调试横幅随后显示导致中断的原因、帮助行、可用的重新启动、一些相关信息,最后显示中断的来源: 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. r

可以通过执行(break)以编程方式调用调试器。例如,调试横幅随后显示导致中断的原因、帮助行、可用的重新启动、一些相关信息,最后显示中断的来源:

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]
在线程中的简单条件下调用调试器
#:
打破
键入“帮助”以获取调试器帮助,或键入(SB-EXT:EXIT)以退出SBCL。
重新启动(可通过数字或可能的缩写名称调用):
0:[继续]从中断返回。
1:[中止]退出调试器,返回顶层。
#(
节点:状态=深度=0)
#(
节点:状态=深度=0)
(DF-BNB1)
资料来源:(休息)
0]
我不了解重启和源之间的相关信息。如有必要,是否可以抑制此信息
有时在我的申请表中有很多行。我已尝试更改调试和安全优化设置,但没有任何效果。

您所混淆的输出与调用
break
的代码位置有关。当我从vanilla Lisp REPL调用它时(不含粘液),它显示:

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

因此,您可以重新编译调用,提供
:print frame source nil
,或者尝试理解当前帧为何看起来是这样的…

您是否看到每次进入调试器时,或者使用
(break)
?我不确定输出应该是什么
#(…)
是向量的表示形式,但内容看起来不像数组元素。@Barmar它似乎只从程序内部出现。在REPL处输入(中断)或(+1'a)将给出正常中断,而无需额外信息。使用SBCL 2.0.0。此外,对(break)的调用位于宏内部。扩展看起来很简单:(macroexpand'(调试>=5(中断时))(IF(>=
*debug*
5)(PROGN(中断))好的,感谢您解释vsevold。现在我看到打印输出显示了(break)所在函数的参数。但仍然不确定如何通过将:print frame source设置为nil来禁止此操作,并获取
*current frame*
的值?我进一步研究了代码,发现有一个
sb debug::*suppress frame print*
变量似乎是用于执行您想要的操作。因此,您可以使用它(可能是全局
(setf sb debug::*抑制帧打印*t)
。另一种选择是使用monkey patch
调试循环乐趣
看起来很有希望,但使用
(defun doit(x)(break)x)
然后
(doit#(1 2 3))进行测试
仍然显示完整的调用环境。感谢您的努力。相反,我刚刚将中断封装在一个简单的函数中,如下所示:
(在此处取消中断()(中断))
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)
(print-frame-call *current-frame* *debug-io* :print-frame-source t)