2014-04-21 15 views
7

Giả sử tôi duy trì ứng dụng phức tạp được kết nối với các hệ thống bên ngoài. Một ngày, nó bắt đầu trả về kết quả bất ngờ cho một số đầu vào nhất định và tôi cần tìm hiểu lý do. Nó có thể là vấn đề DNS, vấn đề liên quan đến tập tin, thay đổi hệ thống bên ngoài, bất cứ điều gì.Thiết bị đo mã số trong haskell

Giả sử rằng số lượng xử lý là rộng rãi, trước khi tôi có thể xác định vị trí có thể có của vấn đề tôi sẽ cần phải có được dấu vết chi tiết mà ứng dụng ban đầu không sản xuất.

Làm cách nào tôi có thể sử dụng mã hiện có để có thể (ví dụ) cung cấp bằng chứng không bay hơi (không phải phiên gỡ lỗi trực tiếp) mà thành phần hoặc chức năng nhất định có lỗi.

+2

Tôi không hoàn toàn theo bạn, nhưng [ekg] (http://hackage.haskell.org/package/ekg) là một công cụ khá tuyệt vời và cho phép bạn đặt các bộ đếm và giá trị tùy ý trong 'IO'. – jberryman

+0

@jberryman Âm thanh như thế này sẽ tạo ra một câu trả lời hay. –

Trả lời

1

Điều này nghe giống như câu hỏi kiểu kiến ​​trúc/thực tiễn tốt nhất hơn bất kỳ điều gì đặc biệt của Haskell, trừ khi tôi hiểu nhầm điều gì đó.

Có vẻ như ứng dụng của bạn cần sử dụng hệ thống ghi nhật ký, chẳng hạn như hslogger. Cách tiếp cận chung là phải có từng thành phần của mã của bạn tạo thông điệp ghi nhật ký có mức độ ưu tiên được đính kèm. Sau đó bạn có thể ứng dụng xử lý các mức độ ưu tiên khác nhau một cách khác nhau, do đó, ví dụ các lỗi nghiêm trọng có thể được hiển thị trên bảng điều khiển, trong khi các lỗi cấp độ và lỗi thông tin đi tới tệp nhật ký. Đôi khi hữu ích khi sử dụng Debug.Trace.traceEventDebug.Trace.traceEventIO thay vì hệ thống ghi nhật ký, đặc biệt nếu bạn nghi ngờ một vấn đề tương tranh, vì bản ghi sự kiện ghc cũng ghi lại thông tin về tạo luồng/chuyển đổi và thu gom rác. Nhưng nói chung nó không phải là một sự thay thế cho một khung khai thác thực tế.

Ngoài ra, bạn có thể muốn sử dụng số assert để kiểm tra sự thật rằng điều kiện "không thể" thực sự không xảy ra.

Các vấn đề liên quan