要排查程序执行过程中出现的问题,一种实用技巧是: 当某个特定函数被调用时自动进入调试器。 你可以为发生问题的函数设置该断点,然后单步执行该函数; 也可以为问题发生前不久调用的函数设置断点, 快速跳过该函数调用后,再单步执行其调用者。
该函数设置 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* ------
该函数取消 function-name 上由 debug-on-entry 设置的断点。
以交互方式调用时,会在迷你缓冲区中提示输入 function-name。
如果省略 function-name 或设为 nil,
则取消所有函数的入口断点。
如果指定函数未设置入口断点,调用该函数无任何效果。