Depuración de un Emacs congelado

48

Estoy usando mew para mi correo electrónico. Necesito usar TLS con mi proveedor de correo electrónico para SMTP. Sin embargo, cuando trato de invocar eso, Emacs se congela.

Me gustaría aprovechar esta oportunidad para aprender más sobre los paquetes de Emacs. ¿Cómo haría para depurar este problema? ¿Hay algún tipo de depurador incorporado, como en Common Lisp? ¿Puedo usar el registro?

Svante
fuente
3
¿Cómo "invocas eso"? Si es mediante el uso de un comando Emacs que se define en Lisp, entonces puede (1) cargar el código fuente que define el comando, (2) usar M-x debug-on-entry THE-COMMAND, luego pasar por el depurador usando d(o, a veces, comitir algunos pasos). Mantenga el código fuente abierto en otro marco, para que pueda seguir lo que está haciendo el depurador. Informe lo que ve aquí o, si cree que sugiere un error de Emacs, use M-x report-emacs-bug.
Dibujó

Respuestas:

45

Antes de recurrir gdb, si está utilizando un sistema operativo Unix-y, puede intentar enviarlo SIGUSR2al proceso Emacs, como se documenta en el DEBUGarchivo mencionado en la otra respuesta.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Esto hará que Emacs intente salir de su bucle actual en el depurador Lisp.

O use este forro sin escribir emacs pid manualmente:

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

Alternativamente, si killallestá disponible:

$ killall -USR2 emacs
Dmitry
fuente
1
Tuve que hacerlo dos veces (bueno, podría haber esperado más de 1 segundo antes de volver a intentarlo :-). De todos modos, detectó el problema (un procesamiento de bloqueo de fuente demasiado lento para una línea larga).
Stéphane Gourichon
se sabe que el bloqueo de fuente bloquea Emacs: si un matcher se dispara pero no mueve el punto hacia adelante, se volverá a disparar para siempre.
Lindydancer
wow, eso fue asombroso. Todavía no estoy seguro de qué está causando mi problema, pero ese truco es un salvavidas, ¡gracias!
Matt
3
En mi sistema, el oneliner se puede simplificar a 'killall -USR2 emacs' (evítelo si tiene múltiples procesos de Emacs, por supuesto).
YoungFrog
1
Recomiende htop ( en.wikipedia.org/wiki/Htop ) para esto. /para buscar emacsy kenviar la señal. El Monitor de actividad en una Mac también puede hacerlo (desde el menú: Ver | Enviar señal al proceso).
Lassi
36

Si la congelación desaparece cuando golpeas C-g, entonces puedes usar el depurador incorporado. Escriba M-x toggle-debug-on-quitantes de enviar el mensaje, presione C-gcuando se congele e inspeccione el *Backtrace*búfer que aparece.

Si C-gno ayuda, entonces la congelación probablemente ocurra en el código C, y necesitará usar un depurador externo como gdb. Presiona C-h C-dpara ver el DEBUGarchivo que da algunas pistas sobre cómo hacerlo. (También puede leer el archivo DEBUG en la interfaz web del repositorio de Emacs ). Esta respuesta incluye más detalles sobre cómo usar gdbcon Emacs.

legoscia
fuente
Puede que tenga que golpear C-gvarias veces: C-g C-g C-g.
Dibujó el
@Drew También noté que es necesario golpearlo varias veces. ¿Sabes por qué?
Wilfred Hughes
2
Si. Vea el manual de Emacs, nodoQuitting . ¿Cómo encontré eso? C-h r i, luego escribe "Cg" y presiona RET.
Dibujó el