如何调试 elisp?
Posted
技术标签:
【中文标题】如何调试 elisp?【英文标题】:How to debug elisp? 【发布时间】:2011-03-16 12:12:36 【问题描述】:通常最简单的调试方法是使用printf
。我可以做些什么来调试 emacs-lisp?如何从 elisp 向 emacs 编辑器打印内容?或者有什么方法可以调试 elisp 代码?
例如,如何检查.emacs
文件中是否运行了以下代码?
(load "auctex.el" nil t t)
【问题讨论】:
这个manual 可能对你有帮助。 请允许我在 Edebug 上推荐 this blog post。 【参考方案1】:调试器 (edebug) 使用起来非常简单。转到函数的定义,然后键入 M-x edebug-defun。下次调用它时,您将能够像使用其他所有调试器一样单步执行代码。键入 ? 以获取键绑定列表,或查看edebug 的文档。
【讨论】:
值得注意的是调试时最重要的键绑定:SPC
继续下一步,i
进入,o
退出,q
退出。跨度>
【参考方案2】:
GNU Emacs 中有两个调试器:
edebug -- 在此处的另一篇文章中进行了解释 调试我使用debug
。这些是常见的入口点(使用方法):
M-x debug-on-entry
后跟要使用调试器输入的函数。
M-x toggle-debug-on-error
--
出现错误时进入调试器。
M-x toggle-debug-on-quit
--
当用户点击 C-g 时进入调试器。
在代码中的特定位置(断点)显式调用函数debug
,以便在这些位置进入调试器:
(调试)
您可以使用 d 或 c 单步调试调试器以跳过特定评估的详细信息。
【讨论】:
如何查看不同变量的值?我可以通过函数进行调试,但不知道如何检查不同变量的值。 @Alok:您可以将光标放在变量上并按RET
,或按e
并计算您感兴趣的变量。
您可以在原始(调用)上下文中评估任何性别。您还可以提供一个 sexp 来评估函数 debug
,以便在打开调试器时向您显示值。例如,(debug nil (current-buffer))
.
@nate, Elisp docs 列出可用的命令。特别是,请参阅 j
、u
和 e
键绑定。如果debug
不够,Edebug
似乎提供了更细粒度的控制流量的可能性。
@nate:这就是c
所做的。我称之为“跳过细节”。 c
大概代表“继续”。它完全评估给定的步骤,而无需您逐步完成每个中间步骤。【参考方案3】:
这对于打印值很有用
(message "Hello (%s)" foo)
但对于数据结构来说效果不佳。为此,请使用
(prin1 list-foo)
或 (prin1-to-string) 将其嵌入到 (message) 中。
【讨论】:
您可以使用“%S”来打印具有格式的数据结构【参考方案4】:最简单的调试方法可能是以交互方式运行您的代码。您可以在 lisp 缓冲区中执行此操作,方法是将您的点放在表达式之后并运行 C-x C-e (eval-last-sexp
)。
或者:
(message "hello world")
C-h f message 了解更多关于内置消息功能的信息。如果您生成大量消息,您可能需要将变量 message-log-max
自定义为更大的值。
【讨论】:
这相当于printf
方法,有时它是一个非常好的方法。【参考方案5】:
一一回答你的问题:
打印一些东西:有一百万种方法。 (message "Hello") 将字符串放入回显区域; (insert "hello") 将字符串放入当前缓冲区的点 ... 如何检查以下代码是否运行:我只需将“auctex.el”替换为(比如说)“frotzumotzulous”(即,任何字符串,只要它没有命名真实文件即可),然后查看是否收到错误消息。如果您没有收到任何错误,那么显然该代码没有在运行。【讨论】:
以上是关于如何调试 elisp?的主要内容,如果未能解决你的问题,请参考以下文章