Как мне отладить аварийное завершение Emacs?

16

Я отлаживаю, почему происходит сбой emacs при использовании функции из пакета 1 . Целью этого процесса отладки является получение полезных данных для отправки с помощью M-x report-emacs-bug.

Чтобы получить помощь по отладке сбоев emacs, я уже посмотрел Руководство по Emacs - Crashing и Emacs Manual - после сбоя , но они не помогли.

После аварии руководство относится к , emacs-buffer.gdbно я понятия не имею , как его использовать. Прося Google о помощи, я наткнулся на этот вопрос emacs.SE и перекомпилировал emacs, используя -ggdb3флаги.

У меня нет предыдущего опыта использования, gdbпоэтому я попробовал несколько неудачных попыток использовать emacs-buffer.gbdфайл.

Вот что я попробовал:

  • gdb -x /path/to/emacs-buffer.gdb
  • gdb -> file /path/to/emacs-buffer.gdb
  • gdb -> source /path/to/emacs-buffer.gdb
  • source /path/to/emacs-buffer.gdb

Кстати, emacs, скомпилированный с -ggdb3флагом, загружается на 10 секунд дольше; раньше это было 5-6 секунд, сейчас около 16-17 секунд. Я знаю точные секунды из-за кода, который вычисляет это в моем init. Ожидается ли увеличение времени запуска?


Сноска 1: emacs постоянно вылетает, когда undo-treeпытается восстановить историю отмен для определенного файла .org (которым я не могу поделиться публично). У меня есть (setq undo-tree-auto-save-history t). Этот сбой происходит только на emacs git master, а не на emacs 24.5. В emacs 24.5 undo-treeвыдает ошибку, утверждающую, что он не может загрузить историю отмены (даже если существует файл истории отмены), но, по крайней мере, сеанс emacs не завершается с ошибкой в ​​этой версии.

Каушал Моди
источник
2
Я уже более двух лет пользуюсь Emacs и до сих пор не понял этого: stackoverflow.com/q/20891431/2112489 Если честно, это несколько загадка, и должна быть авторитетная ветка, которая учит, как это делать Это.
юрист
Хорошо, вопрос состоит в том, чтобы получить количество просмотров, но никаких голосов. Дай мне знать, если я понадоблюсь, чтобы улучшить вопрос. Если вы считаете, что вопрос может дать хороший ответ и может быть полезен сообществу emacs, пожалуйста, поставьте его на голосование, чтобы он привлек внимание потенциального ответчика.
Каушал Моди
Я не хочу угонять вашу ветку, но сделаю предложение. Если поток не привлекает подходящий ответ в течение разумного периода времени (т. Е. Вы решаете, что это значит), возможно, стоит сделать этот поток более общим - например, авторитетный поток о том, как использовать gdb для отладки Emacs аварийно завершает работу, создает значимые следы, которые помогут гуру в команде разработчиков Emacs диагностировать / устранять проблемы при получении отчета об ошибке, который содержит указанную информацию. Я понимаю, что проблема важна из-за undue-treeпроблем, но у нее есть более широкий потенциал .
юрист
@lawlist Это именно то, чего я ожидаю от этой темы. Я не ожидал undo-treeконкретного ответа, потому что знаю, что кому-то еще будет трудно воссоздать именно эту аварию. Также я не могу поделиться всем файлом org, который является единственным, который, кажется, вызывает этот сбой. Поэтому я применил только gdbтег к этому вопросу. Я дал эту историю, чтобы ответы помогли мне отладить сбой emacs в целом, чтобы я мог подать полезный отчет об ошибках emacs .
Каушал Моди
@lawlist Я перефразировал вопрос так, чтобы было ясно, что он не относится ни к одному пакету.
Каушал Моди

Ответы:

15

Самый простой способ отладить аварийное gdbзавершение Emacs - запустить Emacs под , а затем сделать то, что воспроизводит аварийное завершение.

Предполагая, что вы строите свой Emacs из исходного кода, вы должны перейти CFLAGS="-O0 -g3"к ./configureсценарию. Это заставляет компилятор C отключать оптимизацию (что может сбивать с толку при отладке) и активировать максимум отладочной информации в исполняемом файле. Запустите, makeчтобы собрать Emacs.

Затем начните gdbс srcкаталога вашего дерева Emacs:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

В OSX вы захотите перейти --with-nsк ./configureсценарию и запустить GDB на Emacs внутри созданного приложения:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

Причиной запуска из srcкаталога является наличие .gdbinitфайла, который устанавливает полезные определения функций GDB для отладки Emacs. Если этот файл был загружен, вы должны увидеть что-то вроде этого при запуске gdb:

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

Введите, rчтобы начать Emacs. Вы можете передать дополнительные аргументы в той же строке, например r --debug-init.

Затем попытайтесь заставить Emacs потерпеть крах. В случае сбоя вы должны увидеть примечание об этом gdbи снова останетесь в (gdb)приглашении. Если Emacs не падает, но зависает, вы можете нажать C-zв терминале, в котором вы работаете, gdbчтобы вернуться к приглашению.

В командной строке введите, btчтобы получить обратный след. В качестве бонуса, если .gdbinitфайл Emacs был загружен правильно, вы увидите обратный след Lisp после обратного следа C. Обе трассировки очень полезны для включения M-x report-emacs-bug.


В etc/DEBUGфайле в дереве Emacs содержится гораздо больше информации, включая информацию о том, как проверить состояние переменных и т . Д. Вы можете открыть его, введя C-h C-dв Emacs, или прочитать его онлайн .

legoscia
источник
Благодарю. Я найду время сегодня, чтобы опробовать ваше решение. Мне все еще интересно, что emacs-buffer.gdbделает и как его использовать.
Каушал Моди
Насколько я понимаю, это специально для восстановления содержимого файла, который вы редактировали, когда произошел сбой Emacs. Поскольку Emacs автоматически сохраняет каждые 30 секунд и каждые 300 нажатий клавиш, я бы сказал, что это ограниченное использование.
Legoscia
1
Но это также должно помочь восстановить нефайловые буферы, это правильно? Моя идея состояла в том, чтобы использовать это, чтобы увидеть, что * Messages * и * Backtrace * имели непосредственно перед сбоем.
Каушал Моди
Ах, это хороший момент. Я никогда не использовал это сам, поэтому я не уверен, как это сделать.
Legoscia
Вы знаете, как запустить GDB на Emacsclient? Я не могу найти этот двоичный файл в src/. Я нашел это lib-src/хотя, но это не сработало gdb ./emacsclient -a '' -c. Так что я нужна помощь в том , как передать те -aи -cарг в emacsclient вместо к БГД.
Каушал Моди