2011-01-09 9 views
9

Sto cercando di capire come interpretare l'output di, e utilizzare, il debugger di Lisp.Aiuto usando il debugger di Lisp

Ho un backtrace piuttosto semplice per la valutazione della mia funzione, ma non riesco a capire come usarlo per scoprire in quale Lisp 'form' nella mia funzione si è verificata l'eccezione.

Apprezzerei qualsiasi suggerimento su cosa dovrei fare, per trovare dove nel mio codice ha avuto origine l'errore.

Inoltre, perché il secondo fotogramma viene visualizzato come "nessuna informazione di debug disponibile per il frame"?

Ho allegato uno screenshot con il debugger e repl (ho incluso anche la mia funzione di seguito - so che è molto sbagliato - ma sono solo interessato a imparare a usare correttamente il debugger). Inoltre, ho premuto "v" sul primo frame per andare al sorgente, ma questo ha provocato l'errore sotto il repl. (EDIT - la questione del codice sorgente mancante è fissato scaricando & copiandolo al percorso corretto)

alt text

(funzione orribile - commenti si prega)

(defun myquicksort2 (lst) 
    (if (eql 1 (length lst)) 
     lst 
     (let ((mid (middle lst))) 
    (do ((i 0 (+ i 1))) 
     ((>= i mid) (append (myquicksort2 (subseq lst 0 mid)) 
        (myquicksort2 (subseq lst mid (length lst))))) 
     (if (> (ltval i lst) (nth 100 lst)) 
      (let ((tmp (ltval i lst))) 
     (setf (nth i lst) (gtval i lst)) 
     (setf (nth (- (- (length lst) i) 1) lst) tmp))))))) 

(defun ltval (i lst) 
    (nth i lst)) 

(defun gtval (i lst) 
    (nth (- (- (length lst) i) 1) lst)) 

(defun middle (lst) 
    (round (/ (length lst) 2))) 
+1

Uno dovrebbe dire che non esiste il "debugger Lisp". Lisp è una grande famiglia di linguaggi e implementazioni. La maggior parte delle implementazioni ha diversi debugger. Un IDE come SLIME per Emacs aggiunge a quello un'interfaccia di debugger che viene eseguita in cima ai Lisp supportati. –

+0

Hai impostato i flag di ottimizzazione per le informazioni di debug massimo? Prova a valutare questo nel repl prima di compilare tutto: (declaim (optimization (speed 0) (safety 3) (debug 3) (size 0))) – Beef

+0

@Beef - sì, ho già provato questo. – Joel

risposta

4

L'errore è con > e hai un solo > nella tua fonte, quindi è qui che si trova il problema.

modificare Built-in funzioni di CL sono molto inclini a ottimizzazione SBCL, quindi anche se la chiamata di funzione nel codice è quello di CL:<, il codice che è in realtà chiamato (e che si presenta nel debugger) è da un ottimizzato , specifica, routine interna SBCL. Questo è meno di un problema per le funzioni definite dall'utente, dove avrai molte più probabilità di ottenere una cornice utile.

+2

Come mai non sono riuscito a utilizzare "v" nel debugger per portarmi sull'origine della funzione? Voglio davvero imparare come usare il debugger (più che correggere l'errore stesso!). – Joel

+0

@Xach - Per quanto riguarda il punto in cui effettui la prima modifica, c'è un modo per disattivare questa "ottimizzazione aggressiva" - per un output di debug più user friendly? Ho già impostato (sb-ext: restrict-compiler-policy 'debug 3) per il massimo supporto di debug nel codice compilato. – Joel

+0

Poiché l'errore si trova in una routine interna, è necessario installare la sorgente SBCL in modo che SBCL possa trovarla di nuovo. Un modo semplice è creare SBCL e installarlo dal sorgente. – Xach

Problemi correlati