Debugging 我可以自定义common lisp的错误输出格式吗?

Debugging 我可以自定义common lisp的错误输出格式吗?,debugging,common-lisp,sbcl,Debugging,Common Lisp,Sbcl,我用的是SBCL。当我的程序出错时,SBCL将打印一长串回溯信息。这有时很烦人,我必须反复滚动才能找到错误消息是什么。我是否可以自定义错误输出(例如,缩短回溯跟踪列表)?我对sbcl进行了一些实验: (defun crash-big-stack (&optional (c 20)) (if (= c 0) (error "crash boooooom") (another-crash (- c 1))))

我用的是SBCL。当我的程序出错时,SBCL将打印一长串回溯信息。这有时很烦人,我必须反复滚动才能找到错误消息是什么。我是否可以自定义错误输出(例如,缩短回溯跟踪列表)?

我对sbcl进行了一些实验:

(defun crash-big-stack (&optional (c 20))
       (if (= c 0)
           (error "crash boooooom")
                       (another-crash (- c 1))))

(defun another-crash (&optional c)
       (crash-big-stack c))
1) 我使用的是SBCL 1.0.57.0,如果不被要求,它不会给出任何stacktrace(尽管使用slime会导致stacktrace),SBCL崩溃并打印完整stacktrace的唯一场景是使用
(sb ext:disable debugger)
或提供顶级参数
SBCL--disable debugger

SBCL(不带
(sb ext:禁用调试器)
):

就SBCL手册而言,没有办法影响SBCL调试器接口的预定义行为,只能通过设置
sb ext:*调用调试器钩子*

* (defun crash-big-stack (&optional (c 20))
       (if (= c 0)
           (error "crash boooooom")
           (let ((waste (another-crash (- c 1))))
         (+ waste 42))))

CRASH-BIG-STACK
* (defun another-crash (&optional c)
       (crash-big-stack c))

ANOTHER-CRASH
* (setf sb-ext:*invoke-debugger-hook* #'(lambda(&rest args) (sb-ext:exit)))

#<FUNCTION (LAMBDA (&REST ARGS)) {10045CEF1B}>
* (crash-big-stack)
~:
*(解除崩溃大堆栈(&c 20)可选)
(如果(=c0)
(错误“崩溃boooom”)
(让((浪费(另一次碰撞(-c 1))))
(+废物42)))
大堆栈崩溃
*(解除另一次崩溃(&c)可选)
(碰撞大堆栈c)
又一次撞车
*(setf sb ext:*调用调试器钩子*#'(lambda(&rest args)(sb ext:exit)))
#
*(大堆栈崩溃)
~:

请参阅:
*回溯帧计数*

据我所知,您无法配置初始堆栈跟踪,但使用调试器循环可能会改善遇到的一些不方便之处,但您可以完全禁用调试器,并尝试手动步进到崩溃点,我将使用类似Emacs/Slime的工具,调试器出现在另一个缓冲区中的位置。
(crash-big-stack)
unhandled SIMPLE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                    {1002978CA3}>:
  crash boooooom

0: (SB-DEBUG::MAP-BACKTRACE
    #<CLOSURE (LAMBDA # :IN BACKTRACE) {100465352B}>
    :START
    0
    :COUNT
    128)
1: (BACKTRACE 128 #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDERR* {1000169AE3}>)
2: (SB-DEBUG::DEBUGGER-DISABLED-HOOK
    #<SIMPLE-ERROR "crash boooooom" {1004651C23}>
    #<unavailable argument>)
3: (SB-DEBUG::RUN-HOOK
    *INVOKE-DEBUGGER-HOOK*
    #<SIMPLE-ERROR "crash boooooom" {1004651C23}>)
4: (INVOKE-DEBUGGER #<SIMPLE-ERROR "crash boooooom" {1004651C23}>)
5: (ERROR "crash boooooom")
6: (CRASH-BIG-STACK 0)
7: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CRASH-BIG-STACK) #<NULL-LEXENV>)
8: (EVAL (CRASH-BIG-STACK))
9: (INTERACTIVE-EVAL (CRASH-BIG-STACK) :EVAL NIL)
10: (SB-IMPL::REPL-FUN NIL)
11: ((LAMBDA () :IN SB-IMPL::TOPLEVEL-REPL))
12: (SB-IMPL::%WITH-REBOUND-IO-SYNTAX
     #<CLOSURE (LAMBDA # :IN SB-IMPL::TOPLEVEL-REPL) {100450355B}>)
13: (SB-IMPL::TOPLEVEL-REPL NIL)
14: (SB-IMPL::TOPLEVEL-INIT)
15: ((FLET #:WITHOUT-INTERRUPTS-BODY-236911 :IN SAVE-LISP-AND-DIE))
16: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))

unhandled condition in --disable-debugger mode, quitting
* (defun crash-big-stack (&optional (c 20))
       (if (= c 0)
           (error "crash boooooom")
           (let ((waste (another-crash (- c 1))))
         (+ waste 42))))

CRASH-BIG-STACK
* (defun another-crash (&optional c)
       (crash-big-stack c))

ANOTHER-CRASH
* (setf sb-ext:*invoke-debugger-hook* #'(lambda(&rest args) (sb-ext:exit)))

#<FUNCTION (LAMBDA (&REST ARGS)) {10045CEF1B}>
* (crash-big-stack)
~: