如何调试elisp?

pro*_*eek 53 debugging emacs elisp

通常,最简单的调试方法是使用printf.我该怎么做来调试emacs-lisp?如何从elisp打印emacs编辑器?或者有没有办法调试elisp代码?

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

(load "auctex.el" nil t t)
Run Code Online (Sandbox Code Playgroud)

Tre*_*son 69

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

  • 值得注意的是调试时最重要的按键绑定:“SPC”用于继续下一步,“i”用于进入,“o”用于退出,“q”用于退出。 (3认同)

Dre*_*rew 30

GNU Emacs中有两个调试器:

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

我用debug.这些是常见的切入点(使用方法):

  • M-x debug-on-entry 然后是您想要使用调试器输入的函数.

  • M-x toggle-debug-on-error - 引发错误时输入调试器.

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

您可以使用dc跳过调试器,或跳过特定评估的详细信息.

  • @Alok:您可以将光标放在变量上并按`RET`,或按`e`并评估您感兴趣的变量. (5认同)
  • 如何检查不同变量的值?我能够通过函数进行调试,但不知道如何检查不同变量的值. (3认同)
  • 您可以在原始(调用)上下文中评估任何sexp.您还可以提供一个sexp来评估函数`debug`,因此它会显示调试器打开时的值.例如,`(debug nil(current-buffer))`. (3认同)

jpl*_*rom 14

这对于打印值很有用

(message "Hello (%s)" foo)
Run Code Online (Sandbox Code Playgroud)

但对数据结构的效果不佳.为此,使用

(prin1 list-foo)
Run Code Online (Sandbox Code Playgroud)

或(prin1-to-string)将其嵌入(消息)中.

  • 您可以使用"%S"打印带格式的数据结构 (3认同)

Dav*_*her 7

最简单的调试方法可能是以交互方式运行代码.您可以在表达式和running C-x C-e(eval-last-sexp)之后放置您的点,在lisp缓冲区中执行此操作.

或者:

(message "hello world")
Run Code Online (Sandbox Code Playgroud)

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