2014-04-21 5 views
7

Angenommen, ich verwalte komplexe Anwendungen, die mit externen Systemen verbunden sind. Eines Tages beginnt es, unerwartete Ergebnisse für bestimmte Eingaben zurückzugeben, und ich muss herausfinden, warum. Es könnte DNS-Problem sein, filesytem-bezogenes Problem, externe Systemänderung, irgendetwas.Code-Instrumentierung in Haskell

Unter der Annahme, dass die Menge der Verarbeitung umfangreich ist, bevor ich mögliche Standorte des Problems identifizieren kann, müsste ich detaillierte Spuren erhalten, die die ursprüngliche Anwendung nicht erzeugt.

Wie kann ich vorhandenen Code instrumentieren, so dass ich (z. B.) einen nichtflüchtigen Beweis (keine Live-Debugsitzung) liefern kann, dass eine bestimmte Komponente oder Funktion einen Fehler aufweist.

+2

Ich folge dir nicht ganz, aber [ekg] (http://hackage.haskell.org/package/ekg) ist ein ziemlich großartiges Tool, mit dem man beliebige Zähler und Werte in 'IO' setzen kann. – jberryman

+0

@jberryman Klingt so, würde eine gute Antwort geben. –

Antwort

1

Das klingt eher nach einer Architektur/Best Practices-Typ-Frage als irgendetwas, was Haskell-spezifisch ist, es sei denn, ich missverstehe etwas.

Es klingt, als ob Ihre Anwendung ein Protokollierungssystem verwenden muss, z. B. hslogger. Der allgemeine Ansatz besteht darin, dass jede Komponente Ihres Codes Protokollierungsnachrichten mit einer angehängten Priorität erstellt. Sie können dann die Anwendung verschiedene Prioritätsebenen unterschiedlich handhaben lassen, so können beispielsweise kritische Fehler auf der Konsole angezeigt werden, während Debug- und Info-Level-Fehler in Logfiles gelangen.

Es ist manchmal nützlich, Debug.Trace.traceEvent und Debug.Trace.traceEventIO anstelle eines Protokollierungssystems zu verwenden, besonders wenn Sie ein Concurrency-Problem vermuten, da das ghc eventlog auch Informationen über Thread-Launch/Switching und Garbage Collection protokolliert. Aber es ist im Allgemeinen kein Ersatz für einen tatsächlichen Protokollierungsrahmen.

Sie können auch assert als eine Überprüfung der Gesundheit verwenden, dass "unmögliche" Bedingungen wirklich nicht auftreten.