Кодовое оснащение в haskell

Предположим, я поддерживаю сложное приложение, связанное с внешними системами. Однажды он начинает возвращать неожиданные результаты для определенного ввода, и мне нужно выяснить, почему. Это может быть проблема DNS, проблема с файловой системой, изменение внешней системы, что угодно.

Предполагая, что объем обработки является обширным, прежде чем я смогу определить возможные места возникновения проблемы, мне необходимо получить подробные трассировки, которые исходное приложение не производит.

Как я могу применить существующий код, чтобы я мог (например) предоставить энергонезависимое доказательство (не сеанс отладки в реальном времени), что определенный компонент или функция имеет ошибку.

1 ответ

Это больше похоже на вопрос типа архитектуры / лучших практик, чем на что-то специфичное для Хаскелла, если я что-то не так понимаю.

Похоже, что ваше приложение должно использовать систему регистрации, такую ​​как hslogger. Общий подход заключается в том, чтобы каждый компонент вашего кода создавал сообщения регистрации с прикрепленным приоритетом. Затем приложение может по-разному обрабатывать разные уровни приоритета, поэтому, например, на консоли могут отображаться критические ошибки, а ошибки отладки и информационного уровня переходят в файлы журналов.

Иногда полезно использовать Debug.Trace.traceEvent а также Debug.Trace.traceEventIO вместо системы журналирования, особенно если вы подозреваете проблему параллелизма, поскольку журнал событий ghc также регистрирует информацию о порождении / переключении потоков и сборке мусора. Но в целом это не замена реальной структуры ведения журнала.

Кроме того, вы можете использовать assert в качестве проверки здравомыслия, что "невозможные" условия действительно не возникают.

Другие вопросы по тегам