Як налагодити аварію Emacs?


17

Я налагоджую, чому Emacs виходить з ладу при використанні функції з пакета 1 . Метою цього процесу налагодження є отримання корисних даних для надсилання з використанням M-x report-emacs-bug.

Щоб отримати допомогу щодо налагодження збоїв у Emacs, я вже переглянув посібник Emacs - Crashing і Emacs Manual - після аварії , але вони не допомогли.

Посібник After Arash посилається на, 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

У бічній примітці завантаження електронних програм, складених із -ggdb3прапором, займає приблизно 10 секунд; раніше це було 5-6 секунд, тепер приблизно 16-17 секунд. Я знаю точні секунди через код, який обчислює це в моєму ініціаті. Чи очікується це збільшення часу запуску?


Зноска 1: Emacs послідовно виходить з ладу під час undo-treeспроби відновити історію скасування певного файлу .org (яким я не можу публічно ділитися). Я маю (setq undo-tree-auto-save-history t). Цей збій трапляється лише у майстра git master emacs, а не у 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

Найпростіший спосіб налагодження аварії Emacs - це запустити Emacs під gdb, а потім зробити все, що відтворює збій.

Припускаючи, що ви створюєте 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 або прочитати в Інтернеті .


Спасибі. Я сьогодні знайду час, щоб спробувати ваше рішення. Мені все ще цікаво, що emacs-buffer.gdbробить і як цим користуватися.
Каушал Моді

Як я розумію, це спеціально для відновлення вмісту файлу, який ви редагували під час аварії Emacs. Оскільки Emacs автоматично зберігає кожні 30 секунд і кожні 300 натискань клавіш, я б сказав, що це обмежене використання.
legoscia

1
Але це також повинно допомогти відновити нефайлові буфери, це правильно? Моя ідея полягала в тому, щоб побачити, що мають * Повідомлення * та * Backtrace * перед самим збоєм.
Каушал Моді

Ах, це хороший момент. Я ніколи його не використовував, тому не знаю, як це зробити.
legoscia

Чи знаєте ви, як запустити gdb на emacsclient? Я не можу знайти це бінарне в src/. Я знайшов це, lib-src/хоча це не спрацювало gdb ./emacsclient -a '' -c. Так що я потрібна допомога в тому , як передати ті -aі -cарг в emacsclient замість до БГД.
Каушал Моді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.