2010-07-15 19 views
45

Normalmente il modo più semplice per eseguire il debug consiste nell'uso di printf. Cosa posso fare per eseguire il debug di emacs-lisp? Come posso stampare qualcosa sull'editor di emacs da elisp? O c'è un modo per eseguire il debug del codice elisp?Come eseguire il debug di elisp?

Ad esempio, come è possibile verificare se il codice seguente viene eseguito nel file .emacs?

+0

Questo [manuale] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Debugging.html) potrebbe esserti d'aiuto. –

+2

Consentitemi di raccomandare [questo post del blog] (http://endlessparentheses.com/debugging-emacs-lisp-part-1-earn-your-independence.html) su Edebug. – Malabarba

risposta

58

Il debugger (edebug) è piuttosto semplice da utilizzare. Vai alla definizione della funzione e digita M-x edebug-defun. La prossima volta che viene chiamato, sarete in grado di scorrere il codice come con ogni altro debugger. Digitare ? per l'elenco delle associazioni di tasti, oppure consulta la documentazione per edebug.

6

Il modo più semplice per eseguire il debug può essere eseguire il codice in modo interattivo. È possibile farlo in un buffer Lisp posizionando il punto dopo l'espressione e correndo C-x C-e (eval-last-sexp).

alternativa:

(message "hello world") 

C-h messaggio f per scoprire di più sul costruito in funzione di messaggio. Se si generano molti messaggi, è possibile personalizzare la variabile message-log-max con un valore maggiore.

+0

Questo è l'equivalente dell'approccio 'printf', ed a volte è molto buono. – Drew

3

per rispondere alle vostre domande una per una:

  • stampa qualcosa: ci sono un milione di modi. (messaggio "Ciao") inserisce la stringa nell'area dell'eco; (inserisci "ciao") pone la stringa nel buffer corrente nel punto ...
  • come posso controllare se viene eseguito il seguente codice: sostituirei semplicemente "auctex.el" con (diciamo) "frotzumotzulous" (vale a dire qualsiasi stringa, a patto che non assegni un nome a un file reale) e poi vedi se ricevi un messaggio di errore. Se non ricevi alcun errore, allora chiaramente quel codice non viene eseguito.
22

ci sono due debugger in GNU Emacs:

  • edebug - ha spiegato in un altro post qui
  • di debug

io uso debug. Questi sono punti di ingresso comuni (modi per usarlo):

  • M-x debug-on-entry seguita da una funzione che si desidera inserire utilizzando il debugger.

  • M-x toggle-debug-on-error - Immettere il debugger quando viene generato un errore.

  • M-x toggle-debug-on-quit - Inserire il debugger quando l'utente preme C-g.
  • effettuare chiamate esplicite per funzionare debug in luoghi particolari (breakpoints) nel codice, per accedere al debugger in quei luoghi:
 
    (debug) 

Fate un passo attraverso il debugger utilizzando d, o c saltare i dettagli di una particolare valutazione.

+2

come controllare i valori di diverse variabili? Sono in grado di eseguire il debug di una funzione ma non so come controllare il valore per variabili diverse. – Alok

+3

@Alok: puoi posizionare il cursore su una variabile e premere 'RET', o premere' e' e valutare la variabile a cui sei interessato. – danlei

+1

Puoi valutare qualsiasi sexp nel contesto originale (chiamante). Puoi anche fornire un sexp per valutare il funzionamento di 'debug', quindi mostra il valore quando viene aperto il debugger. Ad esempio, '(debug nil (current-buffer))'. – Drew

12

Questo è utile per la stampa valori

(message "Hello (%s)" foo) 

ma non funziona così bene per strutture di dati. Per questo, usa

(prin1 list-foo) 

o (da prin1 a stringa) per incorporarlo in un (messaggio).

+2

È possibile utilizzare "% S" per stampare una struttura dati con formato – ocodo