2011-01-09 10 views
9

Ich versuche zu verstehen, wie die Ausgabe von und verwenden Sie den Lisp-Debugger.Hilfe mit Lisp-Debugger

Ich habe eine ziemlich einfache Backtrace für die Auswertung meiner Funktion, aber ich kann nicht herausfinden, wie man es verwendet, um herauszufinden, in welcher Lisp 'Form' in meiner Funktion die Ausnahme aufgetreten ist.

Ich würde mich über Hinweise freuen, was ich tun sollte, um herauszufinden, wo in meinem Code der Fehler entstanden ist.

Auch - warum wird der zweite Frame angezeigt als "keine Debug-Informationen für Frame verfügbar"?

Ich habe einen Screenshot mit dem Debugger angeschlossen, und repl (Ich habe auch meine Funktion unten - ich weiß, es ist sehr falsch - aber ich bin nur daran interessiert zu lernen, den Debugger richtig zu verwenden). Zusätzlich habe ich 'v' auf dem ersten Frame gedrückt, um zur Quelle zu gehen, aber dies führte zu dem Fehler unter dem repl. (EDIT - das fehlende Quellcode Problem wird durch & Download es auf den richtigen Pfad zu kopieren)

alt text

(schreckliche Funktion - keine Kommentare bitte)

(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

Man sollte erwähnen, dass es keinen 'Lisp Debugger' gibt. Lisp ist eine große Familie von Sprachen und Implementierungen. Die meisten Implementierungen haben unterschiedliche Debugger. Eine IDE wie SLIME für Emacs fügt dazu eine Debugger-Schnittstelle hinzu, die auf den unterstützten Lisps läuft. –

+0

Haben Sie Ihre Optimierungsflags für maximale Debugging-Informationen eingestellt? Versuchen Sie, dies in der repl vor dem Kompilieren alles zu bewerten: (deklamieren (optimieren (Geschwindigkeit 0) (Sicherheit 3) (debug 3) (Größe 0))) – Beef

+0

@Beef - ja, ich habe dies bereits versucht. – Joel

Antwort

4

Der Fehler ist mit > und Sie haben nur eine > in Ihrer Quelle, so ist das, wo das Problem liegt.

bearbeiten Built-in CL-Funktionen bis hin zur Optimierung sehr anfällig sind in SBCL, so dass, obwohl der Funktionsaufruf im Code CL:< ist, wird der Code, der tatsächlich aufgerufen wird (und die im Debugger zeigt nach oben) ist von einem optimierten , spezifische, SBCL-interne Routine. Dies ist weniger ein Problem für benutzerdefinierte Funktionen, bei denen es viel wahrscheinlicher ist, dass Sie einen nützlichen Rahmen erhalten.

+2

Wie kann ich 'v' im Debugger nicht verwenden, um mich zu der Quelle zu bringen, wo die Funktion auftritt? Ich möchte wirklich lernen, wie man den Debugger benutzt (mehr als den Fehler selbst zu reparieren!). – Joel

+0

@Xach - In Bezug auf Punkt machen Sie in Ihrem ersten Edit - gibt es eine Möglichkeit, diese 'aggressive Optimierung' zu deaktivieren - für benutzerfreundlichere Debug-Ausgabe? Ich habe bereits gesetzt (sb-ext: restrict-compiler-policy 'debug 3) für maximale Debug-Unterstützung in kompiliertem Code. – Joel

+0

Da der Fehler in einer internen Routine auftritt, müssen Sie die Quelle der SBCL so installieren, dass die SBCL sie wiederfinden kann. Eine einfache Möglichkeit besteht darin, SBCL zu erstellen und von der Quelle aus zu installieren. – Xach