2014-04-21 16 views
7

Załóżmy, że utrzymuję złożoną aplikację podłączoną do systemów zewnętrznych. Pewnego dnia zaczyna zwracać nieoczekiwane wyniki dla pewnych danych wejściowych i muszę się dowiedzieć, dlaczego. Może to być problem z DNS, problem związany z plikami, zewnętrzna zmiana systemu, cokolwiek.Oprzyrządowanie kodu w haskell

Zakładając, że ilość przetwarzania jest duża, zanim będę mógł zidentyfikować możliwe lokalizacje problemu, będę potrzebował uzyskać szczegółowe ślady, których oryginalna aplikacja nie generuje.

W jaki sposób mogę istniejący kod instrumentu, aby móc (na przykład) dostarczyć nieulotnego dowodu (nie sesji debugowania na żywo), że pewien składnik lub funkcja ma błąd.

+2

Nie podążam za tobą całkowicie, ale [ekg] (http://hackage.haskell.org/package/ekg) to całkiem niesamowite narzędzie i pozwala ci ustawić dowolne liczniki i wartości w 'IO'. – jberryman

+0

@jberryman Wygląda na to, że to dobra odpowiedź. –

Odpowiedz

1

To brzmi bardziej jak pytanie typu architektura/sprawdzone metody niż cokolwiek innego niż Haskell, chyba że coś nie rozumiem.

Wygląda na to, że aplikacja wymaga systemu rejestrowania, takiego jak hslogger. Ogólne podejście polega na tym, aby każdy komponent kodu generował komunikaty rejestrowania z dołączonym priorytetem. Dzięki temu aplikacja może obsługiwać różne poziomy priorytetów w różny sposób, więc na przykład na konsoli mogą być wyświetlane błędy krytyczne, a błędy debugowania i poziomu informacji - do plików logów.

Czasami przydatne jest używanie Debug.Trace.traceEvent i Debug.Trace.traceEventIO zamiast systemu rejestrowania, szczególnie jeśli podejrzewasz problem z współbieżnością, ponieważ dziennik zdarzeń ghc rejestruje również informacje o odradzaniu/przełączaniu wątków i zbieraniu śmieci. Generalnie nie jest to substytut dla rzeczywistej struktury logowania.

Możesz również skorzystać z assert jako sprawdzenia poprawności, że warunki "niemożliwe" tak naprawdę nie występują.