Есть ли хитрость в отладке вращения в emacs elisp, в модуле flymake? - PullRequest
7 голосов
/ 14 ноября 2010

Я получаю вращение процессора в emacs elisp, в модуле flymake C #.(Flymake - это модуль в emacs, который периодически запускает сборку, а затем выделяет любые синтаксические ошибки или предупреждения в текущем буфере.)

Я собираюсь пробраться в код, чтобы найти возможные места, где вращениеможет произойти.

Пока я нахожусь, у кого-нибудь есть предложения по выяснению спина?Есть ли в emacs что-то, что позволяет мне остановить выполнение и посмотреть, где оно остановилось?

Ответы [ 4 ]

9 голосов
/ 15 ноября 2010

Используйте M-x set-variable для установки debug-on-quit на t. Затем, когда возникнет проблема, нажмите C-g , и отладчик вернет вам сведения о том, что было запущено, когда вы его остановили.

5 голосов
/ 03 августа 2011

Flymake устанавливает 1-секундный таймер для каждого буфера, в котором включен режим flymake, чтобы проверить, был ли буфер изменен более чем flymake-no-changes-timeout секунд назад.

Если у вас многобуферы открываются (несколько сотен) в режиме flymake, тогда это может поглотить удивительно большое количество ЦП, у меня есть исправленная версия flymake, которая имеет единый глобальный таймер, который исправляет это, и несколько других проблем:*

Возможно, это не та проблема для вас, но для меня это приведет к блокировке Emacs при открытии в режиме рабочего стола с 600 открытыми файлами, и мне посчастливится обрабатывать одно нажатие клавиши каждые 15 минут.

2 голосов
/ 27 марта 2012

В OS XI была похожая проблема звучания, когда flymake зависал в emacs при открытии нового файла (даже если открыто всего несколько буферов).Включение debug-on-quit не помогло, так как весь графический интерфейс заблокирован.

Присоединение gdb к emacs вернуло следующее:

$ gdb -p `psgrep emacs`
(gdb) bt
#0  0x00007fff98954e42 in __semwait_signal ()
#1  0x00007fff8e5d1dea in nanosleep ()
#2  0x00007fff99e3af05 in +[NSThread sleepUntilDate:] ()
#3  0x000000010015d917 in -[EmacsDialogPanel runDialogAt:] ()
#4  0x000000010015fa1f in ns_popup_dialog ()
[...]

Таким образом, блокировка была вызвана диалоговым сообщением, говорящим "Произошла ошибка конфигурации во время работы ... "или аналогичная

Начиная с этого поста, описывающего проблему , вы можете отключить эти всплывающие сообщения следующим образом:

Иногда, однако, Emacs просто зависает.Красные / желтые / синие кнопки OS X для закрытия / сворачивания / масштабирования становятся серыми, как если бы Emacs потерял фокус, но фактически это активное приложение.Переключение задач вокруг и обратно на Emacs не восстанавливает его.Вы не можете Command-Q выйти из него.

Когда вы наконец сдадитесь, убьете его и перезапустите, вы потеряли свою работу, свои снаряды, и список недавних файлов не сохранился.

(setq flymake-gui-warnings-enabled nil)

Это предотвращает оповещение flymake о том, что оно само отключается, но это лучше, чем альтернатива.

Flymake-display-warning вызывает функцию Emac 'message-box', поэтому могут существовать другие инструменты, вызывающие ту же проблему.

Существует также диалоговое окно общего использования переменных, но установка его по умолчанию t на nil не помогла с flymake.Есть также предложение на веб-сайтах использовать defadvice, чтобы сказать y-or-no-p и yes-or-no-p установить use-dialog-box в nil, но опять же, это не поможет flymake, так как он неиспользуйте эти функции.

0 голосов
/ 14 ноября 2010
...