Со времён Ubuntu 6.10 с нами невидимо присутствует помощник Apport, чья задача грамотно оформить отчёт об ошибке для упавшей программы. Apport в Ubuntu - это классический crash reporter, позволяющий выяснить причину падения программы и исправить её в следующей версии. Apport - это мостик между разработчиком программы и пользователем, у которого на компьютере программа ведёт себя не так как задумывалось.
Система StableReleaseUpdate (SRU). Путешествие от ошибки до её исправления.
Отладка сбоящей программы без автоматизированных средств очень трудоёмка для пользователей. Множество сбоев в программах на компьютерах пользователей оставались без отчёта для разработчика программы и следовательно без исправления, потому что:
Apport - это система, которая:
Apport позволяет в будущем существенно поднять уровень качества программ.
Если разработчик хочет сделать отчёты о падении программы ещё лучше, то нужно обратиться к DeveloperHowTo.
Со стороны пользователя Apport выглядит очень просто и не навязчиво.
Apport автоматически будет вызван:
Происходит создание первоначального отчёта об ошибке в каталоге /var/crash. Имя файла генерируется из пути к упавшей программе и пользовательского ID.
Пример
-rw-r----- vasilisc whoopsie _usr_bin_bluefish.1000.crash -rw-r----- vasilisc whoopsie _usr_bin_compiz.1000.crash -rw-r----- vasilisc whoopsie _usr_lib_skype_skype.1000.crash -rw-r----- vasilisc whoopsie _usr_lib_x86_64-linux-gnu_hud_hud-service.1000.crash -rw-r----- vasilisc whoopsie _usr_lib_x86_64-linux-gnu_libproxy_0.4.7_pxgsettings.1000.crash -rw-r----- vasilisc whoopsie _usr_lib_x86_64-linux-gnu_notify-osd.1000.crash -rw-r----- vasilisc whoopsie _usr_share_apport_apport-gtk.1000.crash
Если упавший процесс "принадлежит" пользователю, который в данный момент вошёл в систему, или процесс системный и в систему зашёл администратор, то Apport информирует об аварии и предлагает сообщить о проблеме разработчикам.
Если пользователь оставляет флажок "Отправить отчёт о неполадке в систему учёта ошибок", то Apport отправляет собранную информацию в систему отслеживания ошибок. Затем открывает в дефолтном браузере вебсайт трекера ошибок, чтобы пользователь смог добавить что-то от себя.
Apport по умолчанию отключён в стабильных релизах, даже если установлен. Компонент Apport, который осуществляет автоматический перехват падений программ, отключён в стабильных релизах по ряду причин:
Заметьте, что Apport не перехватывает SIGABRT сигнал. Если программа получает именно такой сигнал, то нужно ознакомиться с DebuggingProgramCrash.
Начиная с релиза Ubuntu 12.04, Apport работает постоянно для сбора данных падений программ для демона whoopsie (смотри ErrorTracker).
Однако, компонент Apport, который осуществляет автоматический перехват падений программ, по-прежнему отключён. Чтобы включить его нужно сделать:
sudo -e /etc/apport/crashdb.conf
и добавить символ решётки # в начало строки
'problem_types': ['Bug', 'Package'],
Для отключения компонента - удалите символ решётки #.
Есть несколько инструментов для работы с отчётами по ошибкам:
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.
Для того, чтобы задержка и нагрузка на CPU и I/O была как можно меньше, /usr/share/apport/apport собирает данные только, когда падающий процесс ещё существует в памяти. Информация из /proc/pid, дампы, путь к исполняемому файлу, номер сигнала записывается в /var/crash/executable_path.uid_user.crash.
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.
Для примера из каталога /usr/share/apport/package-hooks/:
Если отчёт об ошибке или сбою отправляется через Apport, то нужные хуки вызываются автоматически. Если есть баг, оформленный мимо Apport, а вы заинтересованы в информации, выдаваемой хуком, то можно использовать apport-collect bugnumber
. Больше информации по этому вопросу в Tools.
Ожидаются улучшения в скорости сбора данных и интеграция с бо́льшим количеством языков (трассировка стека вызовов Mono и Python, сообщений assert() и другое).
Сбор другой интересной информации для отчёта, но в тоже время удержать размер дампов в разумных пределах.
Исключение из отчёта упоминаний о пакетах сторонних производителей.
Дополнительные материалы по теме на сайте:
Терпимость к ошибкам при наборе текста в Ubuntu.
Canonical создала отдельную команду для исправления ошибок Unity.
Жизненный цикл исправления ошибок Ubuntu.
Решение проблем в Ubuntu.