2013-07-09 40 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的所有建議(這會將該功能恢復爲其未配準狀態)。這可能會有所幫助,如果有一些建議會在您嘗試追查時造成嚴重問題。