关于调试:如何调试elisp?

How to debug elisp?

通常,最简单的调试方法是使用printf。 我该如何调试emacs-lisp? 如何从elisp打印一些内容到emacs编辑器? 还是有什么方法可以调试elisp代码?

例如,如何检查.emacs文件中是否运行了以下代码?

1
(load"auctex.el" nil t t)


调试器(edebug)非常简单易用。转到函数的定义,然后键入M-x edebug-defun。下次调用它时,您将可以像其他调试器一样逐步执行代码。键入作为键绑定列表,或查看edebug文档。


GNU Emacs中有两个调试器:

  • edebug-在另一篇文章中解释
  • 调试

我使用debug。这些是常见的入口点(使用方式):

  • M-x debug-on-entry,后跟要使用调试器输入的功能。

  • M-x toggle-debug-on-error-
    出现错误时进入调试器。

  • M-x toggle-debug-on-quit-
    当用户点击C-g时,请输入调试器。
  • 在代码中的特定位置(断点)放置对函数debug的显式调用,以在这些位置进入调试器:
1
    (debug)

您可以使用dc逐步调试程序,以跳过特定评估的详细信息。


这对于打印值很有用

1
(message"Hello (%s)" foo)

但不适用于数据结构。为此,使用

1
(prin1 list-foo)

或(prin1到字符串)嵌入到(消息)中。


调试的最简单方法可能是交互式运行代码。您可以在lisp缓冲区中做到这一点,方法是将点放在表达式后面并运行C-x C-e(eval-last-sexp)。

或者:

1
(message"hello world")

C-h f message可以找到有关内置消息功能的更多信息。如果生成大量消息,则可能需要将变量message-log-max自定义为更大的值。


要一一回答您的问题:

  • 打印一些东西:有上百万种方法。 (消息" Hello")将字符串放入回显区域; (插入" hello")将字符串放入点...
  • 我如何检查是否运行以下代码:我只是将" auctex.el"替换为(例如)" frotzumotzulous"(即,任何字符串,只要它没有命名真实文件),然后查看是否收到错误消息。如果没有错误,则很明显代码没有在运行。