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
。除此之外,我尽量避免复杂性,这样我就不必一下子钻研太多。