2013-08-29 24 views
18

Mam wyrażenie nieterminacyjne w Haskell. Chcę debugować i sprawdzać powód, dla którego to się nie kończy. Technika dowiedziałem jest użycie następujących GHCi:Kontynuuj debugowanie w GHC po przerwaniu.

:set -fbreak-on-exception 
:trace nonterminating_expression 
^C 
:hist 50 

Więc mogę zapoznać się z instrukcjami, które są uruchomione w nieskończonej obliczeń. Problem polega na tym, że chciałbym kontynuować obliczanie z :step, ignorując przerwanie. Czy mogę to zrobić?

Jakieś inne rozwiązanie do debugowania obliczeń nieterminacyjnych? (Historia większy niż 50 rejestrów lub innych praktyk, aby pomóc zadanie.)

+0

Czy wiesz, jak ustawić punkty przerwania w dowolnym kodzie? Zrobiłbym przerwę gdzieś w nieskończonej pętli i użyłbym jej do przejścia przez iterację. – Maxander

+0

Tak, ale problemem jest to, że dostanę wiele fałszywych połączeń. Na przykład, myślę, że mam lokalizację nieskończonego cyklu, ale każde wywołanie funkcji prowadzi tylko do nieskończonego cyklu w 1% czasu. –

Odpowiedz

1

Jedno robiłem w przeszłości jest używać unsafePerformIO złamać ilekroć naciśnięciu klawisza:

Powiedzmy t jest oryginalny wyraz wstawić X w wyrażeniu:

import System.IO 
import System.IO.Unsafe 

t i = do print i; t (i+1) 
t2 i = do print i; x; t2 (i+1) 

x = do r <- hReady stdin 
     if r then do a<-hGetChar stdin 
        print a -- break on this line 
      else print "" 

Następnie w wierszu ghci:

*Main> :break 9 
*Main> t2 0 

Naciśnij klawisz klawiatury

*Main> :cont 

wznawia się w miejscu, w którym zostało przerwane.

+0

Działa to tylko przy obliczeniach IO? –