Cosa è questa storia?

Il debugging dei crash di un programma senza l'ausilio di strumenti automatici, rappresenta dispendio di tempo e difficoltà da ambo le parti, sviluppatore e segnalatore. Molti crash di programmi non vengono riportati o non vengono riparati poichè:

Apport è un sistema che

Noi siamo convinti che ciò porterà in futuro alla garanzia di un sempre più alto livello di qualità.

Se si vuole rendere la segnalazione di crash di un proprio programma sempre più utile attraverso Apport, preghiamo consultare /DeveloperHowTo.

Cosa appare all'utente?

L'interfaccia utente di Apport è disegnata per essere semplice e minimamente invasiva.

Se un processo nel sistema muore a causa di un segnale riconducibile ad un 'crash' (segmentation violation, bus error, floating point exception, ecc.), oppure es. una applicazione Python pacchetizzata solleva un eccezione non catturata, il demone di Apport viene automaticamente invocato e produce un iniziale segnalazione in un file situato in /var/crash/ (il nome del file è composto dal nome dell'eseguibile andato in crash e l'id utente). Se il processo andato in crash appartiene all'utente attualmente loggatoo appartiene ad un processo di sistema e l'utente loggato è un amministratore Apport informerà l'utente del crash e ne proporrà la segnalazione:

Ora è possibile fare click su "Mostra dettagli" per vedere quali dati sono stati raccolti:

Se l'utente lascia il checkbox "Inviare una segnalazione...." abilitato, Apport caricherà tutte le informazioni raccolte sul sistema di tracciamento dei bug. Dopodichè apirà la pagina per la segnalazione con il pertinente titolo già impostato, lasciando all'utente il solo compito di inserire una dettagliata descrizione del problema.

Come abilitare Apport

Nei rilasci stabili, Apport è disabilitato anche se è comunque installato. Ci sono due modi per abilitarlo.

Quindi voi potrete ancora agganciare il crash e la finestra di dialogo di Apport apparirà ancora con le istruzioni per segnalare un bug con valide tracce. Apport sarà automaticamente disabilitato al prossimo avvio.

Se state eseguendo il triaging dei bugs, questo è il miglior modo per ottenere tracce da eventuali segnalatori che non hanno usato Apport.

... e cambiare enabled da "0" a "1".

Il componente di Apport che intercetta automaticamente i crash viene disabilitato nei rilasci stabili per una serie di valide ragioni:

  1. Apport raccoglie dati potenzialmente sensibili quali i core dumps, le stack traces ed i file di log. Essi possono contenere password, numeri di carte di credito, numeri di serie ed altre informazioni private.

    Ciò viene mitigato dal fatto che vi viene mostrato cosa sarà inviato al bug tracker e che la segnalazione sarà privata, cioè visibile solamente al the Ubuntu bug triaging team. Noi possiamo ragionevolmente aspettarci che sviluppatori ed utenti tecnicamente colti, che eseguono una versione in fase di sviluppo, siano consapevoli di ciò e sappiano valutare se è opportuno presentare o meno la segnalazione di crash. Ma non possiamo presumere che ogni utente di ubuntu lo sappia fare.

  2. Durante la fase di sviluppo, riceviamo già migliaia di segnalazioni di crash, molte più di quelle che potremmo mai fixare. Continuare a raccoglierle per il rilascio stabile non è particolarmente utile in quanto:
    • I più importanti crash sono già stati scoperti durante la fase di sviluppo.
    • I meno importanti non sono adatti ad essere fixati in un rilascio stabile (vedere https://wiki.ubuntu.com/StableReleaseUpdates

    • Richiedere agli utenti di inviare segnalazioni di crash non è molto sincero, perchè non abbiamo la concreta possibilità di analizzarle tutte.
  3. La raccolta dei dati con Apport impegna non poco la CPU e le risorse di I/O, che rallentano il computer e non consentono di riavviare l'applicazione crashata per molti secondi.

Nota apport non cattura i segnali SIGABRT. In presenza di uno di questi segnali, consultare DebuggingProgramCrash.

Sono uno sviluppatore. Come faccio ad usare queste segnalazioni?

Il formato della segnalazione

Apport usa lo standard Debian del controllo di sintassi per le segnalazioni, infatti raccoglie tutto in un semplice file simile a questo:

DistroRelease: Ubuntu 12.04
ExecutablePath: /usr/bin/gcalctool
Package: gcalctool 5.8.24-0ubuntu2
ProcCmdline: gcalctool
ProcEnviron:
 SHELL=/bin/bash
 PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games
 LANG=de_DE.UTF-8
StackTrace:
 [...]
 #0  0x00002ae577bb37bf in poll () from /lib/libc.so.6
 No symbol table info available.
 #1  0x00002ae57786991e in g_main_context_check () from /usr/lib64/libglib-2.0.so.0
 No symbol table info available.
 [...]
CoreDump: base64
 eJzsXQmcFMXV7+XGA0dBREVoDxSPXQYEB...

Qui sopra è visualizzata solo una piccola parte dei campi contenuti. La segnalazione Apport include un core dump in un formato compresso e codificato, che risulta utile al debugging post-mortem ed alla generazione di una stack trace simbolica.

Comunque, durante il caricamento dei dati sul tracker, potrebbe essere usato un formato differente, ad esenpio utilizzando Launchpad i dati vengono caricati in formato Multipart/MIME, così le parti piccole saranno direttamente nel sommario della segnalazione mentre le più estese saranno allegate separatamente.

Campi

Alcuni campi necessitano di ulteriori approfondimenti:

Strumenti

Ci sono molti strumenti per poter lavorare con una segnalazione di crash:

Come funziona internamente?

Come intercetta il crash

Apport usa /proc/sys/kernel/core_pattern direttamente incanalato nel core dump al suo interno. per intercettare i crash Python, installa un /etc/python*/sitecustomize.py per chiamare Apport su eccezioni non gestite.

Backend

Con la premessa di mantenere il ritardo e l'impatto CPU/IO il più basso possibile, /usr/share/apport/apport raccoglie solo dati acquisibili durante il crash: informazioni da /proc/pid, il core dump, il pèercorso dell'eseguibile, ed il numero del segnale. il file viene scritto in /var/crash/executable_path.uid.crash.

Chiamata del Frontend

In Gnome, update-notifier mantiene un controllo inotify in /var/crash. Quando avviene qualcosa di nuovo, chiama /usr/share/apport/apport-checkreports. Se ci sono nuove segnalazioni, chiama /usr/share/apport/apport-gtk, che è uno dei frontend mostrati nelle immagini precedenti.

Quindi il frontend raccoglie informazioni aggiuntive come la versione del pacchetto, il file dei checksum, oppure la versione del sistema operativo, e chiama tutti i corrispondenti agganci Apport relativi al pacchetto.

Launchpad-based auto-retracer

Il Canonical data center esegue un servizio che automaticamente ritraccia le segnalazioni di Apport. Etichettando le segnalazioni in Launchpad in base all'architettura verra eseguita la ritraccia e l'etichetta verrà rimossa. Le etichette usate sono, need-i386-retrace o need-amd64-retrace. Vediannouncement.

Agganci Apport per-pacchetto

È possibile, per i pacchetti, specificare quali informazioni raccoglere dal sistema per essere incluse nella segnalazione. Ciò è fattibile traminte gli agganci Apport contenuti nei pacchetti. Per qualche utile esempio vedere:

in /usr/share/apport/package-hooks. There is also a list of packages providing apport hooks.

Consultare /DeveloperHowTo per ulteriori informazioni.

Se un crash o una segnalazione di anomalia avvengono tramite Apport, i relativi agganci saranno eseguiti automaticamente. Se si è già segnalato il bug senza l'ausilio di Apport e siete interessati alle informazioni provenienti da questi agganci, richiedere l'esecuzione di apport-collect bugnumber (see #Strumenti).

Use the source, Luke!

Piani futuri

Ulteriori links

Apport_it (last edited 2012-05-17 15:39:55 by dynamic-adsl-78-14-229-79)