Отладка замороженного Emacs


48

Я использую мяу для своей электронной почты. Мне нужно использовать 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.
— Дрю

Ответы:


45

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

$ kill -SIGUSR2 <emacs_pid_goes_here>

Это заставит Emacs попытаться вырваться из своего текущего цикла в отладчик Lisp.

Или используйте этот вкладыш, не набирая emacs pid вручную:

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

В качестве альтернативы, если killallдоступно:

$ killall -USR2 emacs

1
Пришлось сделать это дважды (ну, я мог бы подождать более 1 секунды, прежде чем повторить попытку :-). Во всяком случае, это точно определило проблему (обработка блокировки шрифта слишком медленная для длинной строки).
— Стефан Гурихон

Известно, что font-lock вешает Emacs - если триггер совпадает, но не перемещает точку вперед, он будет запускаться вечно.
— Lindydancer

вау, это было потрясающе До сих пор не уверен, что является причиной моей проблемы, но этот трюк спасатель, спасибо!
— Мэтт

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 .) В этом ответе более подробно рассказывается о том, как использовать gdbEmacs.


Вы , возможно , придется ударить 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.