¿Cómo depuro un bloqueo de emacs?

16

Estoy depurando por qué emacs se bloquea al usar una función de un paquete 1 . El objetivo de este proceso de depuración es obtener datos útiles para enviar utilizando M-x report-emacs-bug.

Para obtener ayuda sobre cómo depurar bloqueos de emacs, ya he consultado el Manual de Emacs - Bloqueo y el Manual de Emacs - Después de un bloqueo , pero no me ayudaron.

El manual After A Crash hace referencia, emacs-buffer.gdbpero no tengo idea de cómo usarlo. Mientras le pedía ayuda a google, me encontré con esta pregunta de emacs.SE , y volví a compilar emacs usando las -ggdb3banderas.

No tengo experiencia previa en el uso, gdbpor lo que intenté algunos intentos fallidos de usar el emacs-buffer.gbdarchivo.

Esto es lo que probé:

  • 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

En una nota al margen, emacs compilado con la -ggdb3bandera tarda unos 10 segundos más en cargarse; antes eran 5-6 segundos, ahora unos 16-17 segundos. Sé los segundos exactos debido a un código que calcula eso en mi init. ¿Se espera este aumento en el tiempo de inicio?


Nota 1: emacs se bloquea constantemente cuando undo-treeintenta restaurar el historial de deshacer para un archivo .org en particular (que no puedo compartir públicamente). Tengo (setq undo-tree-auto-save-history t). Este bloqueo ocurre solo en emacs git master, no en emacs 24.5. En emacs 24.5, undo-treearroja un error que indica que no puede cargar el historial de deshacer (incluso a través del archivo de historial de deshacer existe), pero al menos la sesión de emacs no se bloquea en esa versión.

Kaushal Modi
fuente
2
Llevo más de dos años usando Emacs y todavía no lo he descubierto: stackoverflow.com/q/20891431/2112489 Para ser honesto, es un misterio y debería haber un hilo autoritario que enseñe cómo hacerlo eso.
abogados
Muy bien, la pregunta es obtener conteos de vistas, pero no votos a favor. Avíseme si necesita que mejore la pregunta. Si cree que la pregunta puede dar una buena respuesta y puede ser útil para la comunidad de emacs, vote por favor para que llame la atención de un posible respondedor.
Kaushal Modi
No quiero secuestrar tu hilo, pero haré una sugerencia. Si el hilo no atrae una respuesta adecuada dentro de un período de tiempo razonable (es decir, usted decide lo que eso significa), puede valer la pena hacer que este hilo sea más general, por ejemplo, el hilo autorizado sobre cómo usar gdb para depurar Emacs se bloquea, crea retrocesos significativos que ayudarán a los gurús del equipo de desarrollo de Emacs a diagnosticar / solucionar los problemas al recibir un informe de error que contiene dicha información. Entiendo que el problema es importante debido a undue-treeproblemas, pero tiene un potencial más amplio .
ley
@lawlist Eso es exactamente lo que espero que sea este hilo. No esperaba una undo-treerespuesta específica porque sé que sería difícil para cualquier otra persona recrear ese bloqueo exacto. Además, no puedo compartir todo el archivo de organización, que es el único que parece causar este bloqueo. Entonces apliqué solo la gdbetiqueta a esta pregunta. Di esa historia de fondo para que las respuestas me guíen cómo depurar un bloqueo de emacs en general para que pueda presentar un informe de error útil de emacs .
Kaushal Modi
@lawlist He reformulado la pregunta para que quede claro que no es específica de ningún paquete.
Kaushal Modi

Respuestas:

15

La forma más fácil de depurar un bloqueo de Emacs es iniciar Emacs debajo gdby luego hacer cualquier cosa que reproduzca el bloqueo.

Suponiendo que está construyendo sus Emacs desde la fuente, debe pasar CFLAGS="-O0 -g3"al ./configurescript. Esto hace que el compilador de C desactive las optimizaciones (lo que puede hacer que las cosas sean confusas durante la depuración) y activa la información de depuración máxima en el ejecutable. Corre makepara construir Emacs.

Luego, comience gdbdesde dentro del srcdirectorio de su árbol Emacs:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

En OSX, querrá pasar --with-nsal ./configurescript e iniciar gdb en Emacs dentro de la aplicación creada:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

La razón para comenzar desde el srcdirectorio es que hay un .gdbinitarchivo que configura definiciones útiles de funciones GDB para depurar Emacs. Si ese archivo se cargó, debería ver algo como esto al comenzar 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.

Escriba rpara iniciar Emacs. Puede pasar argumentos adicionales en la misma línea, por ejemplo r --debug-init.

Luego intente hacer que Emacs se bloquee. Si se bloquea, debería ver una nota al respecto gdby volverá a aparecer en el (gdb)mensaje. Si Emacs no se bloquea, pero se congela, puede presionar C-zen el terminal donde se está ejecutando gdbpara volver al indicador.

Una vez que se le solicite, escriba btpara obtener una traza inversa. Como beneficio adicional, si el .gdbinitarchivo Emacs se cargó correctamente, verá una traza inversa de Lisp después de la traza trasera de C. Ambas trazas son cosas muy útiles para incluir M-x report-emacs-bug.


Hay mucha más información, incluyendo cómo examinar el estado de las variables, etc., en el etc/DEBUGarchivo en el árbol de Emacs. Puede abrirlo escribiendo C-h C-ddentro de Emacs, o puede leerlo en línea .

legoscia
fuente
Gracias. Hoy encontraré tiempo para probar su solución. Todavía tengo curiosidad por saber qué emacs-buffer.gdbhace y cómo usarlo.
Kaushal Modi
Según tengo entendido, eso es específicamente para recuperar el contenido del archivo que estaba editando cuando Emacs se bloqueó. Como Emacs guarda automáticamente cada 30 segundos y cada 300 pulsaciones de teclas, diría que es de uso limitado.
legoscia
1
Pero eso también debería ayudar a recuperar búferes que no sean archivos, ¿es correcto? Mi idea era usar eso para ver lo que * Messages * y * Backtrace * tenían justo antes del bloqueo.
Kaushal Modi
Ah, ese es un buen punto. Nunca lo he usado, así que no estoy seguro de cómo hacerlo.
legoscia
¿Sabes cómo ejecutar gdb en emacsclient? No puedo encontrar ese binario en src/. lib-src/Sin embargo, lo encontré pero esto no funcionó gdb ./emacsclient -a '' -c. Así que necesito ayuda sobre cómo pasar esos -ay -cargumentos a emacsclient en lugar de a gdb.
Kaushal Modi