Прерывать оценку и наблюдать текущий стек в отладчике emacs-lisp?

17

Если какая-то функция emacs-lisp, такая как ловушка основного режима, выполняется дольше, чем ожидалось, я иногда хотел бы прервать ее и посмотреть на текущий стек. В идеале я также хотел бы иметь возможность просматривать значения переменных и т. Д. В отладчике. Я не говорю о коде, который я намеренно выполняю в режиме emacs-lisp, а скорее о коде, который выполняется при нормальной работе emacs.

Как я могу прервать выполнение кода emacs-lisp непосредственно в emacs? Я не знаю заранее, какую функцию мне нужно отлаживать.

Например, ввод C-g, хотя он прерывает выполнение, также ничего не говорит мне о том, какая функция была прервана.

Кирилл
источник

Ответы:

18

Вы можете C-gвключить триггер отладчика, включив его debug-on-quit. Просто сделать

M-x toggle-debug-on-quit

Теперь каждый раз, когда вы нажмете, C-gвы получите обратный след того, что происходило. Эта обратная трассировка является интерактивной, поэтому вы можете dпереходить от функции к кнопке и начинать движение по ней c. (Попробуйте, легче увидеть, чем прочитать).

Это та же самая обратная трассировка, которую вы получаете, добавляя (debug)в свой код. Вот небольшой пост в блоге и соответствующая страница справочника Elisp .

Malabarba
источник
(покорно говорит hello);) Удивительное замечание, что отладчик интерактивен - я никогда не думал проверять это :)
Шон Оллред
@SeanAllred да, я узнал только пару недель назад.
Малабарба