2013-08-29 20 views
18

Haskell'de belirsiz bir ifadem var. Hata ayıklamak ve neden sonlanmadığının nedenini incelemek istiyorum. Kesintiden sonra GHC'de hata ayıklamaya devam et

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

Yani sonsuz hesaplamasında çalışan talimatları görebilirsiniz: öğrendiğim bir teknik GHCi içinde aşağıdaki kullanmaktır. Sorun şu ki, :step ile hesaplamaya devam etmek istiyorum. Bunu yapabilir miyim?

Belirleyici hesaplamaları ayıklamak için başka çözümler var mı? (50 kayıtları veya diğer uygulamalara daha büyük Geçmişi görevi yardımcı olmak için.) Geçmişte yaptık

+0

Sınır değer kodlarında kesme noktalarının nasıl ayarlanacağını biliyor musunuz? Sonsuz döngüde bir yere bir mola verir ve bunu bir yinelemeyi adım adım atmak için kullanırdım. – Maxander

+0

Evet, ama sorun, çok fazla yanlış çağrı alabilmem. Örneğin, sonsuz döngünün yerini aldığımı düşünüyorum, ancak her işlev çağrısı sadece% 1 oranında sonsuz döngüye yol açar. –

cevap

1

Tek istediğim bir tuşa basın her kırmaya unsafePerformIO kullanmaktır:

t orijinal ifadesidir diyelim , ifadesinde x ekleyin:

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 "" 

Sonra GHCi isteminde:

anahtar

*Main> :break 9 
*Main> t2 0 

basın klavye

, kaldığınız yerden devam eder.

+0

Bu sadece IO hesaplamaları ile çalışır? –

İlgili konular