2013-07-09 38 views
4

如何用defadvice调试错误?如何调试defadvice

寻找解决方案,我可以找到的建议是不要使用defadvice,因为调试困难。阿门对此,但其他人的defadvices无处不在,我总是遇到我甚至无法追查的错误。

+0

寻找defadvice的地方是我的第一个路障和[这个答案](http://stackoverflow.com/questions/10967367/how-can-i-locate-the-defadvice-for-an-在emacs中建议使用函数)表明一个明显的命令不存在。 –

+0

您可以在'ad-defactivate'中放置一个断点,您首先加载Emacs,然后等待您的建议来触发它并从那里开始工作......这是很多麻烦,但是如果您只需要执行此操作一次... – 2013-07-09 06:38:38

回答

8

还有一件事我能想到的:

  1. 临时命名defadvicedefadvice-old

  2. 写的defadvice这个新版本:


(defmacro defadvice (function args &rest body) 
    `(progn 
    (put ',(cadr args) 'source-position 
      (cons byte-compile-current-file byte-compile-read-position)) 
    (defadvice-old ,function ,args ,@body))) 
  1. 检查(symbol-plist <<name of advice>>),一旦你需要它,那就得所用的宏文件的文件中的位置。
+0

哦,这很聪明。你应该在其他答疑中交叉提出这个想法。 – phils

+0

谢谢,优秀的黑客。这个想法应该以defadvice-defadvice的形式进入emacs。 –

+0

@phils我知道一些在Emacs上工作的人是SO上的常客。也许他们中的一些人会介入/也许有一些陷入“defadice”记住咨询位置的陷阱。如果没有 - 这看起来值得功能要求。我可能会发一个。 – 2013-07-09 09:15:18

3

一种选择是让建议主体调用一个函数来完成它的工作,然后你可以调试该函数。

请注意,您可以评估(ad-deactivate 'function)以取消激活指定的function的所有建议(这会将该功能恢复为其未配准状态)。这可能会有所帮助,如果有一些建议会在您尝试追查时造成严重问题。