Кодовое оснащение в haskell
Предположим, я поддерживаю сложное приложение, связанное с внешними системами. Однажды он начинает возвращать неожиданные результаты для определенного ввода, и мне нужно выяснить, почему. Это может быть проблема DNS, проблема с файловой системой, изменение внешней системы, что угодно.
Предполагая, что объем обработки является обширным, прежде чем я смогу определить возможные места возникновения проблемы, мне необходимо получить подробные трассировки, которые исходное приложение не производит.
Как я могу применить существующий код, чтобы я мог (например) предоставить энергонезависимое доказательство (не сеанс отладки в реальном времени), что определенный компонент или функция имеет ошибку.
1 ответ
Это больше похоже на вопрос типа архитектуры / лучших практик, чем на что-то специфичное для Хаскелла, если я что-то не так понимаю.
Похоже, что ваше приложение должно использовать систему регистрации, такую как hslogger. Общий подход заключается в том, чтобы каждый компонент вашего кода создавал сообщения регистрации с прикрепленным приоритетом. Затем приложение может по-разному обрабатывать разные уровни приоритета, поэтому, например, на консоли могут отображаться критические ошибки, а ошибки отладки и информационного уровня переходят в файлы журналов.
Иногда полезно использовать Debug.Trace.traceEvent
а также Debug.Trace.traceEventIO
вместо системы журналирования, особенно если вы подозреваете проблему параллелизма, поскольку журнал событий ghc также регистрирует информацию о порождении / переключении потоков и сборке мусора. Но в целом это не замена реальной структуры ведения журнала.
Кроме того, вы можете использовать assert
в качестве проверки здравомыслия, что "невозможные" условия действительно не возникают.