Лучшая отладка сбоя Emacs?

9

Хотя Emacs (24.3.93.1) работает нормально, если запущен из Finder, если запущена версия терминала:

/Applications/Emacs.app/Contents/MacOS/Emacs -nw

Emacs падает с:

Fatal error 11: Segmentation fault[1] 51512 abort /Applications/Emacs.app/Contents/MacOS/Emacs -nw,

Кажется, проблема вызвана одной строкой в ​​init.el,

(set-face-attribute 'default nil :font "Menlo-16")

Если эта строка закомментирована, терминальная версия Emacs тоже запустится нормально.

Чтобы точно определить причину аварии, мне потребовалось несколько часов (уменьшив мое init.el наполовину).

Я знаю, что в любом случае Emacs будет наследовать любой шрифт и размер шрифта, указанные в терминальном приложении (в основном, эта строка не имеет смысла в cli.)

  1. Вообще говоря, есть ли лучший способ отладить сбой Emacs? Возможно, используя какой-нибудь отладчик cli, который выводит более описательное сообщение?
  2. Почему эта строка разрушает Emacs через cli, но не запускается из Finder?
GSL
источник
это действительно запускается из кли? или запуск версии терминала, которая вызывает проблему? Попробуйте поместить несколько ошибок в атрибут set-face-attribute? (условие-регистр err (set-face-attribute ...) (ошибка (сообщение «К сожалению!»)))
nic ferrier
3
Подайте отчет об ошибке. Emacs никогда не должен падать из-за кода lisp. Но это может быть проблемой с конкретной сборкой, которую вы используете, это официальный релиз?
Малабарба
@ nic-ferrier: у меня сейчас только одна строка в init.el, (condition-case err (set-face-attribute 'default nil :font "Menlo-16") (error (message "Whoops!")))но у меня та же ошибка с тем же сообщением об ошибке. Никаких дополнительных сообщений, генерирующих elisp.
GSL
@ Malabarba: Я попытался с GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2013-03-13 on bob.porkrind.orgот emacsformacosx.com , и Emacs не откажет. Таким образом, это должно быть ошибкой в ​​более поздних версиях. Я подам отчет об ошибке.
GSL
1
Как указано @Malabarba: Файл отчета об ошибке (немедленно): M-x report-emacs-bug. Затем разработчики Emacs проведут вас через то, что вы можете сделать, чтобы помочь отладить проблему.
Дрю

Ответы:

6

Чтобы помочь вам отследить его в следующий раз

Это случилось со мной раньше. Была ситуация, когда string-to-intEmacs разбился, и мне потребовались часы, чтобы точно определить.
Извините, я не могу дать более хороший ответ, но сбои Emacs происходят глубоко в коде C, и нет никаких встроенных инструментов, доступных для отслеживания таких проблем.

Я предполагаю, что отладка с gdbним возможна, но его эффективность будет зависеть от вашего мастерства с gdb.

Что вам действительно нужно сделать, это

Подать отчет об ошибке

Чистый код elisp (не байтово скомпилированный) никогда не должен приводить к сбою Emacs. Это может вызвать зависание (из-за некоторого бесконечного цикла), и это может привести к нехватке памяти в Emacs. Но, кроме того, любой сбой является ошибкой .

M-x report-emacs-bug

Просто предоставив этот минимально работающий пример, который вы придумали, вместе с описанием вашей сборки и системы, должно быть достаточно помощи для добрых разработчиков.

Malabarba
источник
2
Использование GDB было бы единственным способом. Мы могли бы добавить в Emacs что-нибудь, чтобы обернуть каждый вызов C во что-то, что само по себе перехватывало, но это было бы все время. Emacs не должен аварийно завершать работу, если это произойдет, мы должны специально обработать эту ошибку, чтобы она больше не работала. Так что да, если он сломан, подайте ошибку. Используйте gdb во что бы то ни стало, чтобы выяснить, где именно ошибка.
Nic Ferrier
4

В качестве ссылки для отладки с помощью gdb вы можете использовать src / temacs из дерева сборки. Это Emacs без предварительно созданного elisp, что сбивает с толку отладчик.

gdb --args src/temacs -nw
stsquad
источник
1
Спасибо, отличный совет (и не так уж легко найти вокруг тоже). Спасибо.
GSL