Emacs 如何调试defadvice

Emacs 如何调试defadvice,emacs,Emacs,您如何调试一个涉及到defadvice的错误 寻找解决方案我能找到的就是建议不要使用defadvice,因为调试有困难。我承认这一点,但其他人的诽谤无处不在,我总是遇到我甚至无法开始追踪的bug。一个选择是让建议主体调用一个函数来完成它的工作,然后你可以调试该函数 请注意,您可以评估(ad deactivate'功能)以停用指定功能的所有建议(这将使功能恢复为未建议状态)。如果一些建议在您试图查找时给您带来了严重问题,这可能会有所帮助。我还可以想到一件事: 将defadvice临时重命名为def

您如何调试一个涉及到defadvice的错误


寻找解决方案我能找到的就是建议不要使用defadvice,因为调试有困难。我承认这一点,但其他人的诽谤无处不在,我总是遇到我甚至无法开始追踪的bug。

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


请注意,您可以评估
(ad deactivate'功能)
以停用指定
功能的所有建议(这将使功能恢复为未建议状态)。如果一些建议在您试图查找时给您带来了严重问题,这可能会有所帮助。

我还可以想到一件事:

  • defadvice
    临时重命名为
    defadvice old

  • 编写新版本的
    defadvice


  • 检查
    (symbol plist)
    一旦需要,它将在使用宏的文件的文件中具有位置

  • 找到defadvice的位置是我的第一个路障,它表明一个明显的命令不存在。你可以在加载Emacs的第一件事
    ad-defactivate
    中设置一个断点,然后等待你的建议触发它并从那里开始工作。。。这是很多麻烦,但如果你只需要做一次…哦,那很聪明。你应该在另一个问答中交叉张贴这个想法。谢谢,非常好的技巧。这个想法应该作为defadvice defadvice写入emacs。@phils我知道一些使用emacs自己的源代码的人是这方面的常客。也许他们中的一些人会介入/也许在记住建议的位置时有一些陷阱。如果没有-这看起来值得一提的功能请求。那么我可能会发一封。@tonyday或
    defadice rec
    :P您喜欢哪种方言。
    (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)))