Со времён Ubuntu 6.10 с нами невидимо присутствует помощник Apport, чья задача грамотно оформить отчёт об ошибке для упавшей программы. Apport в Ubuntu - это классический crash reporter, позволяющий выяснить причину падения программы и исправить её в следующей версии. Apport - это мостик между разработчиком программы и пользователем, у которого на компьютере программа ведёт себя не так как задумывалось.
Система StableReleaseUpdate (SRU). Путешествие от ошибки до её исправления.
Что это и зачем?
Отладка сбоящей программы без автоматизированных средств очень трудоёмка для пользователей. Множество сбоев в программах на компьютерах пользователей оставались без отчёта для разработчика программы и следовательно без исправления, потому что:
- Большое количество сбоев сложно воспроизводимы.
- Пользователь не знает как лучше подготовить отчёт для разработчика, используя отладочные символы и gdb.
- Для создания хорошего отчёта нужна информация о самом сбое, версиях пакетов, архитектуре аппаратуры, версии операционной системы и так далее.
- Нет простого интерфейса для пользователя, позволяющего легко отправлять детальный отчёт о проблеме.
- Существующие решения типа bug-buddy или krash специфичны для конкретной среды рабочего стола (desktop environment) и нелегко адаптировать их сторонним разработчикам для своих программ. Так же нельзя получить отчёт о падениях программ, работающих демонами в фоне, типа баз данных или емайл серверов. Плохо интегрируются с существующими отладочными пакетами, которые могут быть в дистрибутиве.
Apport - это система, которая:
- Когда впервые перехватывается падение программы, происходит сбор потенциально нужной информации о самом сбое и об окружении операционной системы.
- Может быть автоматически вызван при возникновении необработанных исключений (unhandled exceptions) в различных языках программирования. В Убунту, для примера, это делается, в том числе и для Python.
- Может быть автоматически вызван для решения любых проблем, которые можно автоматически обнаружить. Убунту, для примера, автоматически обнаруживает ошибки при установке и обновлении пакетов в update-manager.
- Предоставляет интерфейс, который информирует пользователя об аварии и инструктирует о дальнейших действиях.
- Можно создать просто отчёт (не о сбое) для конкретного приложения, чтобы разработчик получил информацию о версиях пакетов, операционной системы и т.д.
Apport позволяет в будущем существенно поднять уровень качества программ.
Если разработчик хочет сделать отчёты о падении программы ещё лучше, то нужно обратиться к DeveloperHowTo.
Как это выглядит для пользователя?
Со стороны пользователя Apport выглядит очень просто и не навязчиво.
Apport автоматически будет вызван:
- Если любой процесс в системе умирает по сигналу, называемому crash. Например segmentation violation = signal 11 = SIGSEGV = segmentation fault = sig11 = segfault или bus errors = SIGBUS или исключение в операции с плавающей запятой = floating-point exception = SIGFPE и другие.
- Программа на языке Python вызывает неперехваченное исключение (Uncaught Exception).
Происходит создание первоначального отчёта об ошибке в каталоге /var/crash. Имя файла генерируется из пути к упавшей программе и пользовательского ID.
Пример
-rw-r----- brovko_rs whoopsie _usr_bin_bluefish.1000.crash -rw-r----- brovko_rs whoopsie _usr_bin_compiz.1000.crash -rw-r----- brovko_rs whoopsie _usr_lib_skype_skype.1000.crash -rw-r----- brovko_rs whoopsie _usr_lib_x86_64-linux-gnu_hud_hud-service.1000.crash -rw-r----- brovko_rs whoopsie _usr_lib_x86_64-linux-gnu_libproxy_0.4.7_pxgsettings.1000.crash -rw-r----- brovko_rs whoopsie _usr_lib_x86_64-linux-gnu_notify-osd.1000.crash -rw-r----- brovko_rs whoopsie _usr_share_apport_apport-gtk.1000.crash
Если упавший процесс "принадлежит" пользователю, который в данный момент вошёл в систему, или процесс системный и в систему зашёл администратор, то Apport информирует об аварии и предлагает сообщить о проблеме разработчикам.
Если пользователь оставляет флажок "Отправить отчёт о неполадке в систему учёта ошибок", то Apport отправляет собранную информацию в систему отслеживания ошибок. Затем открывает в дефолтном браузере вебсайт трекера ошибок, чтобы пользователь смог добавить что-то от себя.
Как включить Apport и почему он выключен по умолчанию?
Apport по умолчанию отключён в стабильных релизах, даже если установлен. Компонент Apport, который осуществляет автоматический перехват падений программ, отключён в стабильных релизах по ряду причин:
- Apport собирает данные в файлах, которые могут хранить конфиденциальные данные. В файлах могут быть пароли, номера кредитных карт и другие приватные данные. Частично проблема сглажена тем, что 1) вы наглядно видите что будет отправлено и 2) все отчёты об ошибках по умолчанию считаются приватными, что накладывает некоторые ограничения на команду Ubuntu bug triaging team. От разработчиков и от технически подкованных пользователей, которые используют разрабатываемый релиз, можно ожидать грамотного решения, что можно и нужно отправлять в отчёте. Но от простых пользователей стабильных релизов никто не ждёт этого. В Ubuntu 12.04 и новее - данный момент призрачно обрабатывается демоном whoopsie. Подробности смотрите в ErrorTracker.
- В ходе разработки нового релиза Ubuntu, разработчики получают тысячи отчётов о проблемах, гораздо больше, чем могут исправить. Продолжать собирать их в стабильном релизе не так полезно из-за:
- Наиболее важные ошибки были обнаружены во время разработки данного релиза.
- Менее важные из них не подходят для получения статуса fixed в стабильном релизе.
- Просить пользователей отправлять нам отчёты об ошибкам будет лицемерно, так как мы не можем помочь всем и нет возможности дать ответ.
- Сбор данных Apport'ом занимает ресурсы CPU и I/O, что может замедлить работу компьютера и не позволит перезапустить упавшую программу некоторое время.
Заметьте, что Apport не перехватывает SIGABRT сигнал. Если программа получает именно такой сигнал, то нужно ознакомиться с DebuggingProgramCrash.
Ubuntu 12.04 и новее.
Начиная с релиза Ubuntu 12.04, Apport работает постоянно для сбора данных падений программ для демона whoopsie (смотри ErrorTracker).
Однако, компонент Apport, который осуществляет автоматический перехват падений программ, по-прежнему отключён. Чтобы включить его нужно сделать:
sudo -e /etc/apport/crashdb.conf
и добавить символ решётки # в начало строки
'problem_types': ['Bug', 'Package'],
Для отключения компонента - удалите символ решётки #.
Инструменты.
Есть несколько инструментов для работы с отчётами по ошибкам:
- Шаблоны Ubuntu Bug: эти шаблоны для пакетов, написанные командой Ubuntu Bug Control, предотвращают создание дубликатов ошибок в трекер. Это файлы XML, которые написаны с прицелом на расширение функционала в будущем.
- apport-unpack: разделяет отчёт на отдельные файлы, по одному на атрибут. Это полезно для извлечения дампов. Этот инструмент не нужен при работе с Launchpad, так как там использует MIME и уже всё разделено на отдельные вложения.
- apport-retrace: обеспечивает в отчёте трассировку стека вызовов при ошибке программы. С ключём -g автоматически скачиваются пакеты с отладочными символами и делается трассировка стека с использованием отладочных символов.
- python-problem-report: этот пакет содержит модуль Python problem_report, который предоставляет общий доступ к словарю отчёта ошибок.
- python-apport: в этом пакете инкапсулированы основные возможности Apport и определены отчёты ошибок и падений. Можно реализовать свои собственные frontends и backends.
- apport-collect: проверяет исходный пакет для существующего на Launchpad бага, запускает хуки Apport и заливает полученные данные обратно в баг трекер.
Как это всё работает?
Apport использует /proc/sys/kernel/core_pattern для получения дампа.
$ cat /proc/sys/kernel/core_pattern |/usr/share/apport/apport %p %s %c
Заметьте, что даже если отключено создание файлов дампов через ulimit -c 0, apport продолжает перехватывать сбои.
Для перехвата необработанных исключений в Python программах используется /etc/python*/sitecustomize.py для вызова Apport.
Backend.
Для того, чтобы задержка и нагрузка на CPU и I/O была как можно меньше, /usr/share/apport/apport собирает данные только, когда падающий процесс ещё существует в памяти. Информация из /proc/pid, дампы, путь к исполняемому файлу, номер сигнала записывается в /var/crash/executable_path.uid_user.crash.
Вызов Frontend.
Update-notifier следит с помощью inotify за каталогом /var/crash/. Если там появляется что-то новое, то он вызывает /usr/share/apport/apport-checkreports. Если есть новые отчёты, то вызывается /usr/share/apport/apport-gtk, который и показывает окна, иллюстрированные выше.
Сам frontend и собирает дополнительную информацию о версиях пакетов, версии операционной системы и вызывает нужные хуки для данной программы.
Для отключения можно запустить
gsettings set com.ubuntu.update-notifier show-apport-crashes false
Хуки Apport.
Можно указать, что нужно дополнительно указать при создании отчёта для конкретной программы. Это делается через хуки Apport.
Для примера из каталога /usr/share/apport/package-hooks/:
- source_xorg.py - добавить в отчёт файлы журналов и детали об оборудовании.
- usplash - игнорировать падения для определённого пути.
- source_totem.py - задать вопросы и на основе их собрать дополнительную информацию.
Для прочтения DeveloperHowTo.
Если отчёт об ошибке или сбою отправляется через Apport, то нужные хуки вызываются автоматически. Если есть баг, оформленный мимо Apport, а вы заинтересованы в информации, выдаваемой хуком, то можно использовать apport-collect bugnumber
. Больше информации по этому вопросу в Tools.
Будущие планы.
Ожидаются улучшения в скорости сбора данных и интеграция с бо́льшим количеством языков (трассировка стека вызовов Mono и Python, сообщений assert() и другое).
Сбор другой интересной информации для отчёта, но в тоже время удержать размер дампов в разумных пределах.
Исключение из отчёта упоминаний о пакетах сторонних производителей.
Дополнительные материалы по теме на сайте:
Терпимость к ошибкам при наборе текста в Ubuntu.
Canonical создала отдельную команду для исправления ошибок Unity.
Жизненный цикл исправления ошибок Ubuntu.
Решение проблем в Ubuntu.
Немає коментарів:
Дописати коментар