19.1.4 调用函数时进入调试器

要排查程序执行过程中出现的问题,一种实用技巧是: 当某个特定函数被调用时自动进入调试器。 你可以为发生问题的函数设置该断点,然后单步执行该函数; 也可以为问题发生前不久调用的函数设置断点, 快速跳过该函数调用后,再单步执行其调用者。

Command: debug-on-entry function-name

该函数设置 function-name 每次被调用时都触发调试器。

任何以 Lisp 代码定义的函数或宏(无论解释执行还是编译执行) 都可设置入口断点。如果该函数是命令, 则无论是从 Lisp 调用还是交互式调用(读取参数后),都会进入调试器。 你也可以为原语函数(即 C 语言编写的函数)设置入口断点, 但仅当原语函数被 Lisp 代码调用时生效。 特殊形式不允许设置入口断点。

以交互方式调用 debug-on-entry 时, 会在迷你缓冲区中提示输入 function-name。 如果该函数已设置入口断点,debug-on-entry 不执行任何操作。 该函数始终返回 function-name

以下示例演示该函数的用法:

(defun fact (n)
  (if (zerop n) 1
      (* n (fact (1- n)))))
     ⇒ fact
(debug-on-entry 'fact)
     ⇒ fact
(fact 3)

------ Buffer: *Backtrace* ------
Debugger entered--entering a function:
* fact(3)
  eval((fact 3))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
------ Buffer: *Backtrace* ------

Command: cancel-debug-on-entry &optional function-name

该函数取消 function-name 上由 debug-on-entry 设置的断点。 以交互方式调用时,会在迷你缓冲区中提示输入 function-name。 如果省略 function-name 或设为 nil, 则取消所有函数的入口断点。 如果指定函数未设置入口断点,调用该函数无任何效果。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike