2013-09-03 20 views
11

Bazı işlevleri otomatik olarak "işaretler" diye bir araç var mı, böylece bir "çağrı yığını" yaklaşımı elde edebilirim.Hata ayıklama haskell: Her çağrıda bir işlevin adını görüntüleme

Aslında, her işlevden önce eklemek zorunda kalmadan, fct = Debug.trace "fct" $ ... yazarak benzer bir davranışa sahip olmak isterim.

Profillemenin -fprof-auto ile benzer bir şey yaptığını biliyorum, ancak uygulama çalışırken görüntülenmesine ihtiyacım var.

Bir süre sonra sonsuz döngülere sahibim ve bu ekranın işlevi hangi işlevlerin hatalı olduğunu hemen gösterebilir. Devrimdeki işlevlerden birinin adını bilmeniz gerektiğinden, hlist ve kesme noktalarını kullanmak gerçekten yararlı değildir.

+1

siz "olasılık hata ayıklama" tekniğini biliyor musunuz? Programınızı çalıştırmaya başlarsınız ve seçtiğiniz herhangi bir noktada, hata ayıklayıcıya ayrılın. Muhtemelen hesaplamak için en çok zaman harcayan fonksiyondasınız (çünkü herhangi bir fonksiyonda durma olasılığınız o fonksiyonda ne kadar zaman harcanmış olduğu ile ilgilidir!). –

+0

Evet, GHCi hata ayıklayıcısının belgelendirmesiyle önerilen budur (ilk olarak, -farkında-istisna ayarlamanız gerekir). Ama hatırladığım kadarıyla, en son kullandığımda işe yaramadı ve ne olduğunu anlayabilmek için her aramadan önce fonksiyon adını eklemem gerekiyordu. –

cevap

12

Burada inanılmaz derecede çirkin bir şey var ;-), ve sadece işlev adının yerine satır numarasını veriyor, ancak çalıştığını öğrenince şaşırdım, bu yüzden paylaşacağımı düşündüm. Ve hala hiçbir şeyden daha iyi. Sadece iyi eski C günlerdeki gibi C önişlemci kullanabilirsiniz: Şimdi

{-# LANGUAGE CPP #-} 

#define traceLoc trace (__FILE__ ++":"++ show __LINE__) 

import Debug.Trace 

f 0 = traceLoc $ 1 
f n = traceLoc $ g (n-1) 
g 0 = traceLoc $ 2 
g n = traceLoc $ 2 * f (n-1)  

,

*Main> f 3 
Test.hs:16 
Test.hs:18 
Test.hs:16 
Test.hs:17 
4 
+0

ne tür bir CPP'dir: '__FILE__ ++": "++ __LINE__' ;-) göster ama çok havalı! –

+1

@SassaNF Bu dosya adı ve satır numarası için CPP makroları ile haskell. CPP sadece bir makro sistemdir, makroların belirli bir dille sonuçlanmasını gerektirecek bir neden yoktur. –

+0

Her ne kadar yüzlerce fonksiyona sahip olsanız da, bu hala bir acıdır :( –

İlgili konular