Налагодження заморожених Emacs


48

Я використовую mew для своєї електронної пошти. Мені потрібно використовувати TLS з провайдером електронної пошти для SMTP. Однак, коли я намагаюся викликати це, Emacs замерзає.

Я хотів би скористатися цією можливістю, щоб дізнатися більше про пакети Emacs. Як би я міг налагодити цю проблему? Чи є якийсь вбудований налагоджувач, як у Common Lisp? Чи можу я використовувати журнал?


3
Як ви "посилаєтесь на це"? Якщо це за допомогою команди Emacs, визначеної в Lisp, ви можете (1) завантажити вихідний код, який визначає команду, (2) використовувати M-x debug-on-entry THE-COMMAND, а потім перейти через налагоджувач, використовуючи d(або іноді cпропустити кілька кроків). Тримайте вихідний код відкритим в іншому кадрі, щоб ви могли слідкувати за тим, що робить налагоджувач. Повідомте про те, що ви бачите тут, або, якщо ви думаєте, що це говорить про помилку Emacs, використовуючи M-x report-emacs-bug.
Дрю

Відповіді:


44

Перш ніж вдаватися до цього gdb, якщо ви використовуєте операційну систему Unix-y, ви можете спробувати надсилати SIGUSR2до процесу Emacs, як це зафіксовано у DEBUGфайлі, зазначеному в іншій відповіді.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Це зробить Emacs спробу вирватися з поточного циклу в налагоджувач Lisp.

Або скористайтеся цим вкладишем, не вводячи pid emacs вручну:

$ ps aux | grep -ie emacs | grep -v grep | awk '{print $2}' | xargs kill -SIGUSR2

Як варіант killall:

$ killall -USR2 emacs

1
Довелося це зробити двічі (ну, я міг зачекати більше 1 секунди, перш ніж повторити спробу :-). У будь-якому разі вона визначила проблему (занадто повільна обробка шрифтової обробки для довгого рядка).
Стефан Гурішон

Як відомо, шрифт-блокування вішає Emacs - якщо тригер відповідника, але не рухає крапку вперед, він буде повторно запускатися назавжди.
Ліндиданер

вау, це було дивовижно. Ще не впевнений, що викликає мою проблему, але ця хитрість - рятівник, дякую!
Метт

3
У моїй системі oneliner можна спростити до 'killall -USR2 emacs' (уникайте, якщо у вас, звичайно, кілька процесів Emacs).
YoungFrog

1
Рекомендуйте для цього htop ( en.wikipedia.org/wiki/Htop ). /шукати emacsта kвідправляти сигнал. Монітор активності на Mac також може це зробити (з меню: Переглянути | Надіслати сигнал на обробку).
Лассі

36

Якщо заморожування зникає під час удару C-g, ви можете використовувати вбудований налагоджувач. Введіть, M-x toggle-debug-on-quitперш ніж надсилати повідомлення, натисніть, C-gколи воно застигне, і огляньте *Backtrace*буфер, який з’являється.

Якщо C-gце не допоможе, замороження, ймовірно, відбувається в коді C, і вам потрібно буде використовувати зовнішній налагоджувач, наприклад gdb. Натисніть, C-h C-dщоб побачити DEBUGфайл, який дає деякі підказки про те, як це зробити. (Ви також можете прочитати файл DEBUG у веб-інтерфейсі сховища Emacs .) У цій відповіді описано докладніші відомості про використання gdbз Emacs.


Ви , можливо , доведеться вдарити C-gкілька разів: C-g C-g C-g.
Дрю

@Drew Я також помітив, що натиснути його потрібно кілька разів. Ти знаєш чому?
Вільфред Х'юз

2
Так. Дивіться посібник Emacs, вузолQuitting . Як я це знайшов? C-h r i, потім введіть "Cg" і натисніть RET.
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.