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.gdb
pero 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 -ggdb3
banderas.
No tengo experiencia previa en el uso, gdb
por lo que intenté algunos intentos fallidos de usar el emacs-buffer.gbd
archivo.
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 -ggdb3
bandera 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-tree
intenta 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-tree
arroja 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.
undue-tree
problemas, pero tiene un potencial más amplio .undo-tree
respuesta 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 lagdb
etiqueta 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 .Respuestas:
La forma más fácil de depurar un bloqueo de Emacs es iniciar Emacs debajo
gdb
y luego hacer cualquier cosa que reproduzca el bloqueo.Suponiendo que está construyendo sus Emacs desde la fuente, debe pasar
CFLAGS="-O0 -g3"
al./configure
script. 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. Corremake
para construir Emacs.Luego, comience
gdb
desde dentro delsrc
directorio de su árbol Emacs:En OSX, querrá pasar
--with-ns
al./configure
script e iniciar gdb en Emacs dentro de la aplicación creada:La razón para comenzar desde el
src
directorio es que hay un.gdbinit
archivo que configura definiciones útiles de funciones GDB para depurar Emacs. Si ese archivo se cargó, debería ver algo como esto al comenzargdb
:Escriba
r
para iniciar Emacs. Puede pasar argumentos adicionales en la misma línea, por ejemplor --debug-init
.Luego intente hacer que Emacs se bloquee. Si se bloquea, debería ver una nota al respecto
gdb
y volverá a aparecer en el(gdb)
mensaje. Si Emacs no se bloquea, pero se congela, puede presionarC-z
en el terminal donde se está ejecutandogdb
para volver al indicador.Una vez que se le solicite, escriba
bt
para obtener una traza inversa. Como beneficio adicional, si el.gdbinit
archivo 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 incluirM-x report-emacs-bug
.Hay mucha más información, incluyendo cómo examinar el estado de las variables, etc., en el
etc/DEBUG
archivo en el árbol de Emacs. Puede abrirlo escribiendoC-h C-d
dentro de Emacs, o puede leerlo en línea .fuente
emacs-buffer.gdb
hace y cómo usarlo.src/
.lib-src/
Sin embargo, lo encontré pero esto no funcionógdb ./emacsclient -a '' -c
. Así que necesito ayuda sobre cómo pasar esos-a
y-c
argumentos a emacsclient en lugar de a gdb.