如何调试 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,以便在这些位置进入调试器: (调试)

您可以使用 dc 单步调试调试器以跳过特定评估的详细信息。

【讨论】:

如何查看不同变量的值?我可以通过函数进行调试,但不知道如何检查不同变量的值。 @Alok:您可以将光标放在变量上并按RET,或按e 并计算您感兴趣的变量。 您可以在原始(调用)上下文中评估任何性别。您还可以提供一个 sexp 来评估函数 debug,以便在打开调试器时向您显示值。例如,(debug nil (current-buffer)). @nate, Elisp docs 列出可用的命令。特别是,请参阅 jue 键绑定。如果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?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定elisp中的操作系统?

如何在 elisp 'if' 语句中编写多个语句?

Elisp 09:库

Elisp 12:兔子洞

如何在 elisp 中捕获 shell 命令的标准输出?

如何在Elisp中获取变量的初始值?