2013-07-09 3 views
4

Как вы можете отлаживать ошибку с помощью дефоссирования?Как отладить defadvice

Поиск решений, которые я могу найти, - это рекомендации не использовать defadvice из-за трудностей отладки. Аминь к этому, но другие дедвейсы народов повсюду, и я всегда сталкиваюсь с ошибками, которые я даже не могу отследить.

+0

Поиск, где дефиса является моим самым первым дорожным блоком и [этот ответ] (http://stackoverflow.com/questions/10967367/how-can-i-locate-the-defadvice-for-an- advised-function-in-emacs) предполагает, что очевидная команда не существует. –

+0

Вы можете поставить точку останова в 'ad-defactivate' самое первое, что вы загружаете Emacs, а затем дождаться, когда ваш совет вызовет его и будет работать оттуда ... Это много неприятностей, но если вам нужно сделать это один раз ... –

ответ

8

Одна вещь, которую я мог думать:

  1. Временное переименование defadvice в defadvice-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

Спасибо, отличный хак. Эта идея должна превратить ее в emacs как defadvice-defadvice. –

+0

@phils Я знаю, что некоторые люди, которые работают в собственных источниках Emacs, регулярно посещают SO. Возможно, некоторые из них войдут/возможно, есть некоторые подводные камни о том, что «defadice» запоминает положение совета. Если нет - это выглядит достойным запроса функции. Тогда я мог бы отправить его. –

3

Один из вариантов состоит в том, чтобы заставить тело совета вызвать функцию для выполнения своей работы, а затем вы можете отлаживать функцию.

Обратите внимание, что вы можете оценить (ad-deactivate 'function), чтобы отключить все советы по указанному function (это вернет функцию в ее неуправляемое состояние). Это может помочь, если некоторые советы причиняют вам серьезные проблемы, пока вы пытаетесь отследить их. более

Смежные вопросы