Debugging 公共Lisp-What';我的调试器怎么了?

Debugging 公共Lisp-What';我的调试器怎么了?,debugging,common-lisp,slime,Debugging,Common Lisp,Slime,我正在尝试运行以下代码: (defparameter *digits-string* (uiop:read-file-string "day08.txt")) (defparameter shape '(25 6)) (defun read-file-into-layers (filepath layer-w layer-h) (with-open-file (stream filepath) (do ((char (read-char stream) (read-char st

我正在尝试运行以下代码:

(defparameter *digits-string* (uiop:read-file-string "day08.txt"))

(defparameter shape '(25 6))

(defun read-file-into-layers (filepath layer-w layer-h)
  (with-open-file (stream filepath)
    (do ((char (read-char stream) (read-char stream))
         (layer-size (* layer-w layer-h))
         (layers nil)
         (layer nil)
         (i nil))
        ((not (digit-char-p char)) layers)
      (when (null layer) (setf layer (make-array layer-size)
                               i 0))
      (setf (aref layer i) (digit-char-p char))
      (incf i)
      (when (= i layer-size) (progn (push layers layer)
                                    (setf layer nil
                                          i 0))))))
(+day08.txt用于)

返回nil,不确定原因(该文件包含一行15k数字,末尾有一个换行符)

我正在尝试调试:

;; 1) Set maximum debug level
(declaim (optimize (speed 0) (space 0) (debug 3)))
;; 2) Recompile the full module + C-u C-c C-c on that function (don't know if that last part is needed)
;; 3) step:
(step (READ-file-into-layers "day08.txt" 25 6))
我仍然看不到任何变量,步进只在
(读取字符流)
(incf I)
处停止,没有别的吗?而且几乎没有定义任何变量

此外,如果我按“e”来计算一些表达式,即使有时某些变量没有出现在stacktrace上,在这种情况下,它会报告它们根本没有定义


你知道调试器为什么会有这种奇怪的行为吗?或者只是我的代码被完全破坏了?不过,在这种情况下,如果调试器能够工作,它将非常有用:)

可能是您的编译器太聪明了。当您仔细观察时,由于反向的
推送
形式,您只会将
设置为
。在某一点上,
变为
(nil)
,然后直接恢复为
nil
。如果所有这些“不行动”都被扔掉了,就没有多少事情要做了


您可以尝试通过使用
反汇编

来反汇编编译后的函数,以了解是否存在这种情况。这可能是因为您的编译器太聪明了。当您仔细观察时,由于反向的
推送
形式,您只会将
设置为
。在某一点上,
变为
(nil)
,然后直接恢复为
nil
。如果所有这些“不行动”都被扔掉了,就没有多少事情要做了


您可以通过使用
反汇编

反汇编已编译函数来尝试收集是否存在这种情况。我使用打印进行了调试,问题在推送过程中,参数被反转。不过,这不是我的重点,我的问题仍然是为什么调试器会这样做,根本没有帮助,以及如何使它正常工作而不必用打印填充代码?我用打印进行了调试,问题在推送过程中,参数被反转了。不过,这不是我的重点,我的问题仍然是为什么调试器会这样做,根本没有任何帮助,以及如何使它正常工作而不必用打印填充我的代码?谢谢,哇!将检查是否是这种情况并报告:)这是@Svante的情况,但是,即使如此,我也无法单步执行setf调用。假设你有这个函数(愚蠢的代码示例),你怎么能通过单步调试它呢?也可以进入setf吗?(defun f(list)(setf(elt list 0)1)(setf(elt list 1)2)list)(step(f(list 0 0))?
setf
是一个宏,在本例中它扩展为一些嵌套的
rplaca
形式,它被编译为一些指令,但没有函数调用。所以你是说交互调试有一些限制,对吗?我能问一下,当你有复杂的程序,你想调试并更详细地了解发生了什么时,你会做什么/建议做什么吗?(包括代码中的宏和SETF之类的调用,这可能对调试有帮助)?非常感谢。对于宏,您所能做的就是查看它们的扩展
Setf
是一个宏。在标准语言工具中,我主要使用
trace
break
。除此之外,我尽量避免复杂性,这样我就不必一下子钻研太多。谢谢你,哇!将检查是否是这种情况并报告:)这是@Svante的情况,但是,即使如此,我也无法单步执行setf调用。假设你有这个函数(愚蠢的代码示例),你怎么能通过单步调试它呢?也可以进入setf吗?(defun f(list)(setf(elt list 0)1)(setf(elt list 1)2)list)(step(f(list 0 0))?
setf
是一个宏,在本例中它扩展为一些嵌套的
rplaca
形式,它被编译为一些指令,但没有函数调用。所以你是说交互调试有一些限制,对吗?我能问一下,当你有复杂的程序,你想调试并更详细地了解发生了什么时,你会做什么/建议做什么吗?(包括代码中的宏和SETF之类的调用,这可能对调试有帮助)?非常感谢。对于宏,您所能做的就是查看它们的扩展
Setf
是一个宏。在标准语言工具中,我主要使用
trace
break
。除此之外,我尽量避免复杂性,这样我就不必一下子钻研太多。