2011-01-09 13 views
9

Próbuję zrozumieć, jak interpretować wyjście i używać debuggera Lisp.Pomoc przy użyciu debuggera Lisp

Mam bardzo prosty Backtrace do oceny mojej funkcji, ale nie wydaje mi się, aby dowiedzieć się, jak go użyć, aby dowiedzieć się, w którym formularzu Lisp w mojej funkcji wystąpił wyjątek.

byłbym wdzięczny żadnych wskazówek co do tego, co należy robić, aby dowiedzieć się, gdzie w moim kodu pochodzi błąd.

także - dlaczego drugi wyświetlanie ramki jako „bez informacji debugowania dostępnego na ramie”?

Dołączyłem zrzut ekranu z debuggerem i replikację (dodałem także funkcję poniżej - wiem, że to bardzo źle - ale interesuje mnie tylko nauka prawidłowego korzystania z debuggera). Dodatkowo, trafiłem "v" na pierwszej klatce, aby przejść do źródła, ale spowodowało to błąd poniżej rep. (EDIT - brakujący kod źródłowy problem został rozwiązany poprzez pobieranie & skopiowanie go do właściwej ścieżce)

alt text

(straszne funkcja - komentarzy proszę)

(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

Należy wspomnieć, że nie ma "debuggera Lisp". Lisp to duża rodzina języków i implementacji. Większość implementacji ma różne debuggery. Identyfikator taki jak SLIME dla Emacsa dodaje do tego interfejs debugowania, który działa na obsługiwanych Lisps. –

+0

Ustawiłeś flagi optymalizacji pod kątem maksymalnych informacji debugowania? Spróbuj to sprawdzić w repl, zanim wszystko skompilujesz: (declaim (optimize (speed 0) (safety 3) (debug 3) (size 0))) – Beef

+0

@ Beef - tak, próbowałem już tego. – Joel

Odpowiedz

4

Błąd znajduje się > i masz tylko jeden > w swoim źródle, więc tam właśnie jest problem.

edit Wbudowane funkcje CL są wysoce podatne na optymalizację w SBCL, więc mimo że wywołanie funkcji w kodzie jest CL:< kod, który jest faktycznie nazywa (i która pojawia się w debuggera) wynosi od zoptymalizowany , specyficzna, wewnętrzna procedura SBCL. Jest to mniej problematyczne dla funkcji zdefiniowanych przez użytkownika, gdzie znacznie bardziej prawdopodobne jest uzyskanie użytecznej ramki.

+2

Jak to się stało, że nie mogłem użyć "v" w debuggerze, aby zabrać mnie do źródła, w którym występuje funkcja? Naprawdę chcę nauczyć się korzystać z debuggera (w większym stopniu niż naprawianie samego błędu!). – Joel

+0

@Xach - Jeśli chodzi o punkt, w którym dokonujesz pierwszej edycji - czy istnieje sposób na wyłączenie tej "agresywnej optymalizacji" - w celu uzyskania bardziej przyjaznego dla użytkownika wyniku debugowania? Już ustawiłem (sb-ext: restrict-compiler-policy 'debug 3) dla maksymalnej obsługi debugowania w skompilowanym kodzie. – Joel

+0

Ponieważ błąd występuje w wewnętrznej procedurze, musisz zainstalować źródło SBCL w taki sposób, aby SBCL mógł go znaleźć ponownie. Jednym prostym sposobem jest zbudowanie SBCL i zainstalowanie go ze źródła. – Xach

Powiązane problemy