OK, vậy đây là một câu hỏi đơn giản. Tôi đã viết một hàm debug :: String -> IO()
. Tôi muốn thiết lập mọi thứ để khi tôi biên dịch chương trình của mình theo một cách, hàm này ghi vào lỗi tiêu chuẩn, và nếu tôi biên dịch chương trình của tôi theo cách khác, hàm này sẽ trở thành no-op. Có một số chuyển đổi dễ dàng biên dịch thời gian để làm điều đó? Hay tôi phải tự mình thực hiện điều gì đó?Trình chuyển đổi trình biên dịch để bật/tắt thông báo gỡ lỗi?
Trả lời
Tôi không nghĩ rằng liên quan đến trace
là phương pháp phù hợp để giải quyết vấn đề này.
Thay vào đó, bạn có thể sử dụng bộ tiền xử lý để tắt/bật thông báo gỡ lỗi. Đặt những điều sau đây trong một file riêng biệt:
{-# LANGUAGE CPP #-}
import System.IO
debug :: String -> IO()
debug message =
#ifdef DEBUG
hPutStrLn stderr message
#else
return()
#endif
Dòng {-# LANGUAGE CPP #-}
phép tiền xử lý C cho file hiện hành. Sau đó, bạn có thể biên dịch tệp có/không cần gỡ lỗi bằng cách sử dụng ghc -DDEBUG
hoặc chỉ ghc
.
Bạn có thể thực hiện việc này bằng cách sử dụng bộ tiền xử lý CPP và #ifdef
.
Trước tiên, sử dụng
#ifdef
để chọn giữa hai phiên bản của hàm.{-# LANGUAGE CPP #-} module Logging (debug) where debug :: String -> IO() #ifdef DEBUG debug = putStrLn #else debug _ = return() #endif
Sau đó, thêm một lá cờ để tập
.cabal
của bạn để kiểm soát nó.... flag debug description: Enable debug logging default: False executable foo -- or library if flag(debug) cpp-options: -DDEBUG ...
Cuối cùng, để cho phép gỡ lỗi, bật cờ với
-f
khi cấu hình:$ cabal configure -f debug
Để bổ sung cho câu trả lời tuyệt vời đưa ra ở đây, tôi muốn đề cập đến phương pháp này, trong trường hợp những người (như tôi) đang sử dụng phiên bản mới nhất của stack
cùng với hpack
.
Trong tập tin package.yaml
tôi thêm như sau:
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
Sau đó, tôi sẽ khuyên bạn nên sử dụng traceIO
từ Debug.Trace
kết hợp với NoTrace
, do đó traceIO
sẽ không có hiệu lực khi mã được biên dịch mà không có sự debug
cờ :
{-# LANGUAGE CPP #-}
-- ...
#ifdef DEBUG
import Debug.Trace
#else
import Debug.NoTrace
#endif
-- ...
someFunc :: IO()
someFunc = do
-- ...
traceIO "Whatever..."
Khi sử dụng ngăn xếp, cờ debug
có thể được bật bằng cách sử dụng --flag
tùy chọn:
stack build --flag "your-package:debug"
Hoặc nếu bạn đang thử nghiệm gói của bạn:
stack build --flag "your-package:debug"
Nếu hpack
không được sử dụng, thì bạn có thể cấu hình file cabal của bạn như được giải thích bởi hammar.
- 1. Chuyển đổi sang trình biên dịch ARC - LLVM 3.0 Lỗi
- 2. Trình biên dịch/trình biên dịch/trình biên dịch C++
- 3. Thông báo lỗi biên dịch: CS0433
- 4. Python: Cách phát hiện trình thông dịch gỡ lỗi
- 5. Lỗi trình biên dịch cho Nullable Bool
- 6. Mã gỡ lỗi trong trình thông dịch Python
- 7. Lỗi trình biên dịch ArrayList
- 8. Làm cách nào để thay đổi ngôn ngữ của thông báo lỗi của trình biên dịch Microsoft C#?
- 9. Loại chuyển & tự gây ra trình biên dịch lỗi
- 10. Sự khác nhau giữa trình biên dịch và thông tin gỡ lỗi trình liên kết là gì?
- 11. autotools: Bật cảnh báo trình biên dịch
- 12. Lỗi: trình xây dựng dự kiến, trình phá hủy hoặc chuyển đổi loại trước ';' mã thông báo?
- 13. Trình biên dịch có trình biên dịch không?
- 14. Lỗi trình biên dịch khi sử dụng generics và khai báo chuyển tiếp trong Delphi XE2
- 15. Phát triển iPhone - Trình biên dịch của Trình biên dịch!
- 16. Tại sao điều này biên dịch và có bất kỳ chuyển đổi trình biên dịch có thể làm cho trình biên dịch báo cáo nó như là một lỗi hoặc cảnh báo?
- 17. Cách thay đổi trình biên dịch tomcat
- 18. Lỗi trình biên dịch C++ trong netbeans
- 19. Lỗi trình biên dịch C++ trong xamltypeinfo.g.cpp
- 20. Lỗi trình biên dịch Java Generics
- 21. Lỗi trình biên dịch Ruby LESS
- 22. Làm cách nào để gỡ lỗi chương trình được biên dịch bằng 'make'?
- 23. C để trình biên dịch brainfuck?
- 24. Có cách nào trong sbt để chuyển đổi các cảnh báo trình biên dịch thành các lỗi sao cho quá trình tạo không thành công?
- 25. Gỡ lỗi sau khi chết của một chương trình được biên dịch bởi Mono AOT
- 26. Quá trình biên dịch
- 27. Trình biên dịch biên dịch trong C#
- 28. Không thể gỡ lỗi trình trợ giúp Razor - dường như IIS không biên dịch với các biểu tượng gỡ lỗi?
- 29. Lỗi trình biên dịch bit dịch chuyển hoặc trường hợp góc?
- 30. Thay đổi Trình biên dịch Mặc định Trong Emacs?
Bạn đã cân nhắc sử dụng 'Debug.Trace' chưa? [Haskel Debugging] (http://en.wikibooks.org/wiki/Haskell/Debugging) cung cấp một số chi tiết khá chi tiết. – devnull
@devnull 'dấu vết' sẽ không làm những gì tôi muốn - nhưng' traceIO' có thể ... – MathematicalOrchid