2010-07-15 13 views
45

Normalmente, la manera más fácil de depurar es usando printf. ¿Qué puedo hacer para depurar emacs-lisp? ¿Cómo puedo imprimir algo al editor de emacs desde elisp? O ¿hay alguna manera de depurar el código elisp?Cómo depurar elisp?

Por ejemplo, ¿cómo puedo verificar si el siguiente código se ejecuta en el archivo .emacs?

(load "auctex.el" nil t t) 
+0

Este [manual] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Debugging.html) puede ser de ayuda para usted. –

+2

Permítanme recomendarles [esta publicación del blog] (http://endlessparentheses.com/debugging-emacs-lisp-part-1-earn-your-independence.html) en Edebug. – Malabarba

Respuesta

58

El depurador (edebug) es bastante fácil de usar. Vaya a la definición de la función y escriba M-x edebug-defun. La próxima vez que se llame, podrá recorrer el código como con cualquier otro depurador. Tipo ? para la lista de combinaciones de teclas, o consulte la documentación para edebug.

6

La manera más fácil de depurar puede ser ejecutar el código de forma interactiva. Puede hacerlo en un búfer de lisp colocando su punto después de la expresión y ejecutando C-x C-e (eval-last-sexp).

alternativa:

(message "hello world") 

C-h mensajes f para saber más sobre el construido en función de mensaje. Si genera muchos mensajes, es posible que desee personalizar la variable message-log-max a un valor mayor.

+0

Esto es el equivalente al enfoque 'printf', y a veces es muy bueno. – Drew

3

para responder a sus preguntas una por una: algo

  • de impresión: hay un millón de maneras. (mensaje "Hola") pone la cadena en el área de eco; (inserte "hola") pone la cadena en el búfer actual en el punto ...
  • cómo puedo verificar si se ejecuta el siguiente código: simplemente reemplazaría "auctex.el" con (por ejemplo) "frotzumotzulous" (es decir, cualquier cadena, siempre que no nombre un archivo real) y luego vea si recibe un mensaje de error. Si no obtiene ningún error, entonces claramente ese código no se está ejecutando.
22

Hay dos depuradores de GNU Emacs:

  • Edebug - explican en otro post aquí
  • depuración

utilizo debug. Estos son puntos de entrada comunes (formas de usarlo):

  • M-x debug-on-entry seguido por una función que desea introducir utilizando el depurador.

  • M-x toggle-debug-on-error - Ingrese el depurador cuando se produce un error.

  • M-x toggle-debug-on-quit - Introduzca el depurador cuando el usuario realiza C-g.
  • Realizar llamadas explícitas a funcionar debug en determinados lugares (puntos de ruptura) en su código, para entrar en el depurador en esos lugares:
 
    (debug) 

que el paso por el depurador utilizando d, o c omitir los detalles de una evaluación particular.

+2

cómo verificar los valores de las diferentes variables? Puedo depurar a través de una función pero no sé cómo verificar el valor para diferentes variables. – Alok

+3

@Alok: puede colocar el cursor sobre una variable y presionar 'RET', o presionar' e' y evaluar la variable que le interesa. – danlei

+1

Puede evaluar cualquier sexp en el contexto original (llamado). También puede proporcionar un sexp para evaluar para que funcione 'debug', por lo que le muestra el valor cuando se abre el depurador. Por ejemplo, '(debug nil (current-buffer))'. – Drew

12

Esto es útil para la impresión de valores

(message "Hello (%s)" foo) 

pero no funciona tan bien para las estructuras de datos. Para eso, use

(prin1 list-foo) 

o (prin1-to-string) para incrustarlo en un (mensaje).

+2

Puede usar "% S" para imprimir una estructura de datos con formato – ocodo