Digamos que emacs arroja algún error que no entiendo. O tal vez el error dice "El valor del símbolo como variable es nulo: modos", pero hay muchas apariciones del símbolo modes
en mi código, por lo que necesito algo de contexto. ¿Se puede configurar Emacs para mencionar el número de línea del código lisp para que yo pueda saber qué código está causando el error?
Intenté hacerlo (setq stack-trace-on-error '(buffer-read-only))
y ejecuté el código perpetrador en un esfuerzo por obtener un seguimiento de la pila. No hay rastro de pila tampoco.
También he intentado llamar edebug-defun
a mi función y recorrerla. No es hasta que salgo de la función que se produce el error.
(Realmente no estoy tan interesado en la causa del error particular que estoy enfrentando actualmente como en el desarrollo de habilidades generales de depuración para elisp. Por favor, infórmeme sobre cómo puedo obtener un número de línea, un sexp o un seguimiento de pila de un error.)
fuente
nil
debug-on-error
? ¿Eso no ayuda?t
y luego proceder a evaluar una función de lanzamiento de errores)debug-ignored-errors
no enumere ningún error. Si establecedebug-on-signal
en non-nil
, y fue el caso en que el otro código manejó el error, podrá obtener el error antes que el otro código.Respuestas:
Emacs proporciona una buena cantidad de recursos de depuración que incluyen
M-x toggle-debug-on-error
,M-x toggle-debug-on-quit
depurar la señal (que se puede usar enviandoUSR2
a Emacs desde el exterior),debug-on-entry
(de una función),debug-on-message
(cuando se ve una coincidencia específica de expresión regular de un mensaje) y, finalmente,debug
como alternativa para instrumentar una función conC-u C-M-x
.Ambos
debug
yedebug
ofrecen suficiente funcionalidad para inspeccionar el estado de Emacs al evaluar el código que le interesa, presionee
e ingrese una expresión.Sin embargo, mientras
edebug
salta al lugar en la función instrumentada y, por lo tanto, le da una pista sobre dónde mirar (lo cual es un poco tonto ya que ya sabe exactamente qué ha instrumentado),debug
no hace esto en absoluto. Realicé un truco más pequeño después de descubrir que cada vez quedebug
evalúa un búfer, emite el valor del punto asociado con el error; en otras palabras, ¡usar esta información en el búfer puede darle un número de línea en la traza inversa!Con esto, la pregunta original en el título debe ser respondida. En cuanto a su problema para obtener un seguimiento en primer lugar, no tengo ideas útiles.
fuente
M-x debug
...? Entonces, ¿qué presiono?debug
, puede verificar visitando un archivo elisp defectuoso, haciendoM-x toggle-debug-on-error
yM-x eval-buffer
, luego, debería aparecer una traza hacia atrás con un número de línea en la posición problemática.eval-buffer
? Por ejemplo, si solo presiona un método abreviado de teclado que ejecuta un comando privado que falla y abre el depurador en el*Backtrace*
búfer ..Tal vez porque ahora es 2018, pero en mi caso, solo tuve que activar la depuración como sugirió wasamasa: Mx toggle-debug-on-error
Después de esto, Mx eval-buffer en mi archivo defectuoso de Elisp dio contexto al proporcionar la posición del error, así:
Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]
Mx goto-char salta a la posición de error:
M-x goto-char 523
fuente
He extendido la respuesta de wasamasa para incluir información adicional:
fuente