Отладка замороженного 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.

legoscia
источник
Вы , возможно , придется ударить C-gнесколько раз: C-g C-g C-g.
Дрю
@Drew Я также заметил, что несколько раз ударить его необходимо. Ты знаешь почему?
Уилфред Хьюз
2
Да. Смотрите руководство по Emacs, узелQuitting . Как я это нашел? C-h r i, затем введите «Cg» и нажмите RET.
Дрю