понеділок, 27 травня 2013 р.

Apport Ubuntu

Со времён Ubuntu 6.10 с нами невидимо присутствует помощник Apport, чья задача грамотно оформить отчёт об ошибке для упавшей программы. Apport в Ubuntu - это классический crash reporter, позволяющий выяснить причину падения программы и исправить её в следующей версии. Apport - это мостик между разработчиком программы и пользователем, у которого на компьютере программа ведёт себя не так как задумывалось.

Система StableReleaseUpdate (SRU). Путешествие от ошибки до её исправления.



Система 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 информирует об аварии и предлагает сообщить о проблеме разработчикам.

Ubuntu приложение внезапно закрылось.

Ubuntu Информация о программе.

Если пользователь оставляет флажок "Отправить отчёт о неполадке в систему учёта ошибок", то 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.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments