如何在不中断while-no-input的前提下调试其内部调用的compute函数
调试
while-no-input上下文内函数的解决方案 问题根因
while-no-input宏的核心逻辑是检测到任意用户输入事件时,立即终止内部代码执行并返回nil。edebug交互调试时的按键操作会被它识别为输入事件,因此会直接跳出compute的执行流程,打断调试。
以下是三种无需中断while-no-input运行即可正常调试的方案:
方案1:临时重定义while-no-input(最简单,适用于不需要验证while-no-input本身中断逻辑的场景)
调试前执行以下代码,临时覆盖while-no-input的宏定义,使其直接执行内部代码,跳过输入检测逻辑:
(defmacro while-no-input (&rest body) `(progn ,@body))
调试完成后执行以下代码恢复原始定义即可:
(fmakunbound 'while-no-input)
方案2:使用edebug trace非交互模式(适用于需要保留while-no-input原生逻辑的场景)
不需要交互步进的情况下,可以开启edebug的trace模式,所有执行信息会自动输出到*edebug-trace*缓冲区,无需按键操作,不会触发输入检测:
- 给
compute函数正常插桩启用edebug - 执行
M-x edebug-trace-mode开启trace模式 - 运行目标代码,所有函数调用参数、执行步骤、返回值都会自动写入trace缓冲区,可事后查看
方案3:临时修改输入检测逻辑(适用于需要保留while-no-input逻辑同时做交互调试的场景)
给input-pending-p加临时环绕advice,edebug激活时忽略输入检测,避免while-no-input被调试按键触发中断:
(defun ignore-input-when-edebug-active (orig-fn &rest args) (if (bound-and-true-p edebug-active) nil (apply orig-fn args))) (advice-add 'input-pending-p :around #'ignore-input-when-edebug-active)
调试完成后删除advice恢复原生逻辑:
(advice-remove 'input-pending-p #'ignore-input-when-edebug-active)
内容的提问来源于stack exchange,提问作者alinsoar
相关产品推荐
相关产品推荐

