Links

Дебаггинг

В этой статье собраны все самые известные и полезные способы продебажить свой и чужой код.

Самый известный логгер баггов на php Monolog

Надеюсь, кто нибудь когда нибудь наполнить примерами

Логгер баггов от Интерволги

Цель системы учёта - выделить из общего потока ошибок, те которые нужно обработать вручную. Далее по порядку. Напомню, что перехват ошибок в Битриксе можно настроить в файле /bitrix/.settings.php .
Настройка собственного обработчика в .settings.php
Настройка собственного обработчика в .settings.php
Нужно указать свой класс-обработчик, который должен быть унаследован от ExceptionHandlerLog и реализовывать методы write(), initialize(), а также путь к файлу класса.
При появлении ошибки в обработчике нам доступна информация:
  • текст ошибки c названием файла и строкой;
  • трассировка.
Минимальный набор методов классе-обработчике
Минимальный набор методов классе-обработчике
Если получить хеш от пути к файлу, в котором возникла ошибка, номера строки и текста сообщения, то у каждой ошибки будет уникальный идентификатор, который поможет бороться с дублями.
Формирования ID (хеша) ошибки
Формирования ID (хеша) ошибки

О способах хранения ошибок

Стоит ли дублировать сообщения об ошибках на почту и прочие мессенджеры? Все сообщения - не стоит, потому что на одном хите их может быть более сотни. Как насчёт БД? БД - это хороший выбор, до тех пор пока не возникнет ошибка, препятствующая записи ошибки. Риск выглядит теоретическим, но это возможно.
Преимущества
Недостатки
Применение
Файловая система
- запись файла-ошибки - это одна операция (fwrite(), например);
- для чтения ошибок можно использовать текстовый редактор;
- файлы можно пересылать, обмениваться, делать общими;
- нужно написать свой скрипт для вывода списка, управления;
Может использоваться для учёта всех типов ошибок.
База данных
- ошибок может быть много, с подробным описанием;
- поиск, добавление, удаление средствами СУБД;
- можно добавлять дополнительные поля (комментарии, статус и прочие).
- нужно написать свой скрипт для вывода списка, управления;
- есть риск появления ошибок, которые будут препятствовать записи в БД;
- сбор ошибок создаст дополнительную нагрузку на БД сайта;
Может использоваться для учёта всех типов ошибок.
E-mail
- сообщений может быть много;
- сообщения могут содержать подробный текст ошибок.
- при большом потоке сообщений об ошибках с ними становится сложно работать;
Оповещения об ошибках типа E_ERROR, E_WARNING (т.е. единичные случаи).
Мессенджеры (XMPP)
- мгновенная доставка;
- сообщений может быть много;
- нужна программа-клиент (Psi, например);
- сообщений может быть много, но лучше, если они будут короткими, т.к. большие логи неудобно читать.
Вывод фактов появления ошибок, без подробного описания.
SMS - сообщения
- быстрая доставка;
- не нужен интернет.
- нужно оплачивать;
- сообщения должны быть короткими.
Сообщения о критических ошибках.
Наш выбор — файловая система. Да, не так красиво, но зато наглядно, быстро и надёжно. Плюс к этому, файлами можно обмениваться и это решает задачу совместной работы.
Какие категории ошибок будут в нашей системе? Предлагаю такие:
  • "новая" - тут всё понятно;
  • "обработанная" - устранена программистом или не представляет вреда;
  • "системная" - ошибка ядра, её не исправляем;
  • "пропущена" - не требует обработки, т.к. создана намеренно, в тестовой среде.
Так как решили использовать файлы, то перечисленные категории - это папки. Изменение категории ошибки - это перемещение файла между папками.
Для борьбы с дублями будем для каждой ошибки создавать хеш, он соответствует названию файла. А в файл помещать подробную информацию - дату/время, трассировку, можно даже комментарии программиста.
Папки-категории ошибок и файлы ошибок в категории “Новые”
Папки-категории ошибок и файлы ошибок в категории “Новые”
Пример содержимого файла ошибки
Пример содержимого файла ошибки

Работа над ошибками

Перейдём к алгоритмам. Как будет работать сохранение одной ошибки:
  1. 1.
    перехват в классе обработчике;
  2. 2.
    создание хеша (ID);
  3. 3.
    сохранение подробной информации в файл (в папку "новые").
Работать с массой файлов не удобно, поэтому напишем простой скрипт, который
  • выводит список категорий (выпадающий список);
  • выводит список ошибок выбранной категории (в виде ссылок на файлы);
  • позволяет переносить ошибку в выбранную категорию.
Тогда действия программиста:
  1. 1.
    выбрать категорию "новые";
  2. 2.
    кликнуть на ссылку на ошибку;
  3. 3.
    обработать ошибку, переместить её в одну из категорий.
Список ошибок для обработки
Список ошибок для обработки
Может быть ситуация, когда программист обработал ошибку, но она возникла вновь. В этом случае обработчик ошибок перед сохранением файла должен проверять, нет ли файла с таким же названием в папке "обработанные". Если файл ошибки там есть, то выходит, что он не обработан и нужно переместить его обратно в "новые".
А чтобы программист об этом узнал, можно и почту использовать, поскольку такие случаи будут единичными. Другой вариант - выводить на следующем хите всплывающее окно со списком повторившихся ошибок.

Заключение

Развивая систему, на одном из проектов мы разработали панель управления, которая программно изменяет настройки .settings, способы оповещения программиста и прочие параметры обработки.
Список ошибок для обработки
Список ошибок для обработки
Конечно, для обработки даже 10% ошибок E_NOTICE на большом сайте потребуется время. Но работа над ошибками превращается из чистки авгиевых конюшен в прозрачный процесс.

Рецепты дебагинга от Раиса

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