Tamam, işte basit bir soru. Bir fonksiyon yazdım debug :: String -> IO()
. Programımı bir şekilde derlediğimde, bu fonksiyon standart hataya yazıyor ve eğer programımı başka bir şekilde derlersek, bu fonksiyon no-op olur. Bunu yapmak için kolay bir derleme zamanı anahtarı var mı? Yoksa kendim bir şey mi uygulamak zorundayım?Derleyici, hata ayıklama iletilerini açmak/kapatmak için geçiş yapar mı?
cevap
Bu sorunu çözmek için trace
'un doğru yaklaşım olduğunu düşünmüyorum. Hata ayıklama iletilerini devre dışı bırakmak/etkinleştirmek için bir önişlemci kullanabilirsiniz. Üste | ayrı bir dosyada aşağıdakileri koyun:
{-# LANGUAGE CPP #-}
import System.IO
debug :: String -> IO()
debug message =
#ifdef DEBUG
hPutStrLn stderr message
#else
return()
#endif
{-# LANGUAGE CPP #-}
çizgi geçerli dosya için C önişlemci sağlar. Daha sonra dosyayı ghc -DDEBUG
veya sadece ghc
kullanarak hata ayıklama olmadan/derleyemezsiniz.
Bunu CPP önişlemcisini ve #ifdef
kullanarak yapabilirsiniz.
Öncelikle fonksiyonun iki sürümü arasında seçim yapmak
#ifdef
kullanın.{-# LANGUAGE CPP #-} module Logging (debug) where debug :: String -> IO() #ifdef DEBUG debug = putStrLn #else debug _ = return() #endif
Sonra de kontrol etmek için
.cabal
dosyasına bir bayrak ekleyin. yapılandırırken... flag debug description: Enable debug logging default: False executable foo -- or library if flag(debug) cpp-options: -DDEBUG ...
Son olarak, hata ayıklamayı etkinleştirmek için,
-f
işaretleyin etkinleştirmek:$ cabal configure -f debug
burada verilen mükemmel cevapları tamamlamak için, ben durumda, bu yaklaşımı söz istiyorum insanlar (benim gibi), 'un en son sürümünü hpack
ile birlikte kullanıyorlar. package.yaml
dosyasında
aşağıdaki eklendi:
flags:
debug: # Or whatever name you want to give to the flag
description: Enable debug
manual: True
default: False
when:
- condition: flag(debug)
cpp-options: -DDEBUG
Sonra kod debug
bayrağı olmadan derlenmiş zaman traceIO
hiçbir etkisi olmayacaktır böylece NoTrace
birlikte Debug.Trace
den traceIO
kullanmak öneriyoruz : yığın kullanırken
{-# LANGUAGE CPP #-}
-- ...
#ifdef DEBUG
import Debug.Trace
#else
import Debug.NoTrace
#endif
-- ...
someFunc :: IO()
someFunc = do
-- ...
traceIO "Whatever..."
, debug
bayrağıkullanılarak etkinleştirilebilirseçeneği:
stack build --flag "your-package:debug"
Ya da paket test ediyorsanız: hammar tarafından açıklandığı gibi
stack build --flag "your-package:debug"
hpack
kullanılmazsa, o zaman Cabal dosyasını yapılandırabilirsiniz.
- 1. Mockito hata ayıklama iletilerini nasıl etkinleştiririm?
- 2. Derleyici, const_cast semantiklerini c stili kalıplarda devre dışı bırakmak için geçiş yapar mı?
- 3. C önişlemcisi kaç geçiş yapar?
- 4. Knockout Doğrulama - Hata iletilerini gösterme
- 5. Derleyici hata
- 6. Hata iletilerini İngilizce'ye ayarlama çalışmıyor
- 7. Tüm uygulamalar için Android Hata Ayıklama Günlük İletilerini Devre Dışı Bırakma
- 8. Firefox'taki hata ayıklama hata ayıklama
- 9. Jquery, görüntüler arasında geçiş yapar.
- 10. VS2015 Evrensel Windows uygulamaları için çıktıda DirectX hata ayıklama iletilerini etkinleştirme
- 11. Hata ayıklama kodu ilk Entity Framework geçiş kodları
- 12. Hata Ayıklama Modu VB 6'da mı?
- 13. React Native: Hata ayıklama menüsü açılamıyor
- 14. Hata ayıklama amaçları için hazır bir HTTP sunucusu var mı?
- 15. ASP.Net Core, bir hata ayıklayıcıda hata ayıklama değil hata ayıklama
- 16. StreamReader'ı Değiştirme Hata İletilerini Vermek İçin Dosya Bulunamadıysa
- 17. Hata ayıklama Trace in C#
- 18. ext js Başlangıçta konsol hata ayıklama hata iletileri (css bölümünden)
- 19. Hata ayıklama çıkış pencerelerindeki ses iletilerini devre dışı bırak - visual studio 2012
- 20. Libc hata iletilerini yakalamak,/dev/tty yönlendirmesi
- 21. Kesme noktaları JavaScript hata ayıklama için ulaşmıyorsanız
- 22. Sayısallık alt seçenekleri için hata iletilerini nasıl özelleştiririm?
- 23. ölümcül hata C1001: Derleyici
- 24. Hata iletilerini işlemenin en iyi yolu
- 25. jQuery mouseover üzerinde geçiş yapar - sıralamayı önler
- 26. , görüntü tarayıcıları için web tarayıcıları yapar mı?
- 27. Nasıl hata ayıklama tabindex
- 28. NetBIOS önbellekleme yapar mı?
- 29. Die() ob_end_flush() yapar mı?
- 30. Eclipse Java Hata ayıklama dosyaları ile hata ayıklama
'Debug.Trace' kullanmayı düşündünüz mü? [Haskel Debugging] (http://en.wikibooks.org/wiki/Haskell/Debugging) bazı detaylar veriyor. – devnull
@devnull 'iz 'istediğimi yapmayacak - ama' traceIO 'olabilir ... – MathematicalOrchid