Fornire una Traccia dello Stack
|
Questa pagina è stata presa dalla precedente documentazione Wiki di Fedora. È stata ripulita per la pubblicazione qui sul Portale Documenti di Fedora, ma non è stata ancora rivista per accuratezza tecnica. Probabilmente è
Le revisioni per accuratezza tecnica sono molto apprezzate. Se vuoi aiutare, consulta il file README nel repository sorgente per istruzioni. Le pull request sono accettate su https://pagure.io/fedora-docs/quick-docs Una volta corretta questa pagina, rimuovi questa nota. |
Una traccia dello stack è una delle informazioni più importanti che puoi fornire per aiutare gli altri a debuggare un crash di un’applicazione. Questa pagina descrive l’importanza delle tracce dello stack e delinea diversi metodi per ottenerle.
Se stai sperimentando un crash, i passaggi di base per generare una traccia dello stack utile per le applicazioni desktop Gnome comuni sono:
-
Installa gli RPM -debuginfo appropriati prima del crash (vedi la sezione "Cosa sono gli RPM debuginfo, e come ottenerli?" qui sotto).
-
Attendi che si verifichi il crash o esegui i passaggi che lo riproducono.
-
ABRT (Automatic Bug Reporting Tool) in Fedora rileverà automaticamente il crash e otterrà una traccia dello stack.
-
Includi la traccia dello stack nel tuo report di bug (vedi il documento "Come Segnalare un Bug" per istruzioni complete).
Se ABRT non si avvia automaticamente, dovrai avviare il programma in modo speciale, utilizzando un debugger (come gdb). Vedi la sezione Ottenere una traccia di stack usando solo GDB qui sotto.
Istruzioni speciali si applicano per programmi Java e Firefox.
Cos’è una traccia dello stack (backtrace)?
Una traccia dello stack (a volte chiamata anche backtrace) è un elenco di chiamate di funzione che portano a un certo punto nel programma. Strumenti di debug come gdb o bug-buddy possono ottenere tracce dello stack da applicazioni crashate in modo che gli sviluppatori possano capire cosa è andato storto.
Come appare una traccia dello stack?
Una traccia dello stack tipica appare simile alla seguente:
[New Thread 8192 (LWP 15167)]
0x420ae169 in wait4 () from /lib/i686/libc.so.6
.
.
.
Una backtrace migliore, con simboli debuginfo (vedi sotto) appare così:
0x000000350a6c577f in *__GI___poll (fds=0xe27460, nfds=9, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:83
83 return INLINE_SYSCALL (poll, 3, CHECK_N (fds, nfds), nfds, timeout);
.
.
.
Nota i nomi dei file e i numeri di riga dove le funzioni vengono chiamate.
Cosa sono i simboli di debug, e perché sono importanti?
Quando un programma viene compilato con switch speciali per generare simboli di debug (lo switch del compilatore -g), vengono memorizzate informazioni extra nel file del programma. Queste informazioni possono essere usate per generare una traccia dello stack che contiene molte più informazioni, come il numero di riga esatto del file sorgente dove qualcosa è andato storto. Senza queste informazioni è molto difficile capire cosa è andato storto guardando la traccia dello stack.
Cosa sono gli RPM debuginfo, e come ottenerli?
Fedora include un tipo speciale di RPM chiamati RPM debuginfo. Questi RPM creati automaticamente contengono le informazioni di debug dai file del programma, ma spostate in un file esterno. Tutti gli strumenti che gestiscono le informazioni di debug sanno come cercare automaticamente in questi file. Questo ti permette di installare facilmente le informazioni di debug quando ne hai bisogno. Devi installare la versione e l’architettura esatta corrispondente del debuginfo dell’applicazione che stai cercando di debuggare.
Esempio: Verifica della Versione e Architettura Corrispondenti
[warren@computer ~] $ rpm -q --qf '%{name}-%{version}-%{release}.%{arch}\n' gaim gaim-debuginfo
gaim-2.0.0-0.26.beta5.i386
gaim-debuginfo-2.0.0-0.26.beta5.i386
Ogni pacchetto con binari nella distribuzione ha un pacchetto debuginfo corrispondente.
Installazione degli RPM debuginfo utilizzando DNF
debuginfo-install è un plugin utile, parte del pacchetto dnf-plugins-core, che abilita automaticamente i repository debuginfo e scarica tutti i pacchetti debuginfo necessari. Puoi fare:
$ dnf debuginfo-install <pkg-spec>
per installare tutti i pacchetti debuginfo necessari per il pacchetto <pkg-spec>.
Per installare solo il set minimo di pacchetti debuginfo, usa l’elenco dei pacchetti del comando (senza installare nulla) per ottenere i nomi dei pacchetti debuginfo e i loro repository rispettivi. Poi costruisci il comando di installazione secondo l’esempio seguente:
$ dnf --enablerepo=fedora-debuginfo --enablerepo=updates-debuginfo install <pkg-spec>-debuginfo
Questo è utile quando non vuoi installare debuginfo per tutte le dipendenze del pacchetto debuggato, poiché il loro debuginfo spesso non è necessario.
Installazione degli RPM debuginfo utilizzando yum
debuginfo-install è un’utilità utile, parte del pacchetto yum-utils, che abilita automaticamente i repository debuginfo e scarica tutti i pacchetti debuginfo necessari. Puoi fare:
$ debuginfo-install foo
per installare tutti i pacchetti debuginfo necessari per il pacchetto foo.
Per installare solo il set minimo di pacchetti debuginfo, usa l’output di debuginfo-install (senza installare nulla) per ottenere i nomi dei pacchetti debuginfo e i loro repository rispettivi. Poi costruisci il comando di installazione secondo l’esempio seguente:
$ yum --enablerepo fedora-debuginfo,updates-debuginfo install foo-debuginfo
Questo è utile quando non vuoi installare debuginfo per tutte le dipendenze del pacchetto debuggato, poiché il loro debuginfo spesso non è necessario.
Installazione manuale degli RPM debuginfo
Questi pacchetti possono essere scaricati dai mirror normali di Fedora nella sottodirectory "debug" della directory dell’architettura. Ad esempio, i pacchetti debuginfo per l’ultima versione di sviluppo sono disponibili da http://mirrors.fedoraproject.org/publiclist/Fedora/development/ . Usa il mirror più vicino a te per il download.
Packager
Se sei un packager e cerchi informazioni sui pacchetti RPM debuginfo, consulta il documento Pacchetti debuginfo.
Come genero una backtrace?
Assicurati innanzitutto di aver installato i pacchetti debuginfo per l’applicazione che stai debuggando e tutte le librerie correlate. Spesso uno sviluppatore ti indicherà di installare pacchetti debuginfo specifici, poiché può dedurre da una traccia di stack quali librerie sono coinvolte nel crash. Consulta qui sotto per i pacchetti consigliati per alcuni tipi di applicazioni comuni.
Esistono diversi modi per ottenere una traccia di stack:
-
Ottenere una traccia di stack usando Ottenere una traccia di stack usando solo GDB.
-
Ottenere una traccia di stack da un core dump con GDB.
-
Ottenere una traccia di stack da un’applicazione usando Strumento di Segnalazione Automatica dei Bug.
Quali pacchetti debuginfo devo installare?
Come minimo, dovrai installare il pacchetto debuginfo per l’applicazione che sta crashando. Puoi scoprire a quale pacchetto appartiene l’applicazione digitando rpm -qf percorso-del-programma.
Per alcuni tipi di programmi, è molto utile installare anche un paio di pacchetti predefiniti che risultano utili per quasi tutte le tracce di stack:
-
Applicazioni Gnome e applicazioni che usano Gtk+:
glib2-debuginfo, pango-debuginfo, gtk2-debuginfo -
Applicazioni KDE:
qt-debuginfo, kdelibs-debuginfo
Ottenere una traccia di stack usando solo GDB
|
Se stai eseguendo un programma Java come Eclipse o Tomcat, la situazione è un po' più complessa - consulta Programmi Java per i dettagli. |
Per prima cosa, esegui il seguente comando per avviare gdb:
gdb nome-del-programma
Dove nome-del-programma è il nome del programma che è crashato (ad esempio: /usr/bin/gnome-panel).
Quindi, al prompt di gdb, digita:
run
Se devi passare degli argomenti al programma, forniscili dopo il comando run, come ad esempio:
run --argomento
Una volta che il programma è in esecuzione, riproduci il crash e torna al terminale dove hai eseguito gdb. Dovrebbe essere visualizzato il prompt di gdb; in caso contrario, premi Ctrl+C per accedere al debugger. Al prompt del debugger gdb, digita:
thread apply all bt full
Se questo non funziona (cioè non ottieni alcun output, il che può accadere con programmi non multi-thread), digita invece <code>bt</code>. Se ancora non ottieni alcun output, leggi [[#special| questa nota]] su come ottenere una traccia di stack in circostanze particolari. L’output è la traccia di stack. Copia e incolla tutto in un file di testo.
Puoi uscire da gdb digitando quit.
A volte, la traccia può essere molto lunga e difficile da copiare e incollare. In tali situazioni, salvare la traccia in un file è comodo:
gdb
> run
# il programma crasha
> set logging file backtrace.log
> set logging on
> thread apply all bt full
> set logging off
> quit
Ottenere una traccia dello stack da un core dump
Se il programma che crasha lascia un core dump, puoi usare GDB per ottenere una traccia di stack. I core dump vengono salvati in un file sul tuo disco rigido e di solito hanno nomi come "core" o "core.3124". Per ottenere una traccia di stack da uno di questi file, esegui il seguente comando:
gdb nome-del-programma nome-file-core
Dove nome-del-programma è il nome del programma che è crashato (ad esempio: /usr/bin/gnome-panel), e nome-file-core è il nome del file core che contiene il core dump (ad esempio: core.7812).
Quindi, al prompt di gdb, digita:
thread apply all bt full
Se questo non funziona (cioè non ottieni alcun output, il che può accadere con programmi non multi-thread), digita invece bt. Se ancora non ottieni alcun output, leggi questa nota su come ottenere una traccia di stack in circostanze particolari. L’output è la traccia di stack. Copia e incolla tutto in un file di testo.
Puoi uscire da gdb digitando quit.
Nota che la creazione dei file core è disabilitata per impostazione predefinita in Fedora (in /etc/profile). Per abilitarli per una sessione di shell, digita al prompt della shell:
ulimit -c unlimited
Come installare ABRT
Se hai installato Fedora tramite un’immagine LiveCD, ABRT dovrebbe già essere installato. Dovresti essere in grado di avviarlo in Applicazioni → Strumenti di Sistema → Strumento Automatico di Segnalazione Bug. Se ABRT non è installato, per qualsiasi motivo, puoi installarlo manualmente facendo il seguente a riga di comando:
$ su -c 'dnf install abrt'
o vai su Sistema → Amministrazione → Aggiungi/Rimuovi Software in Gnome, e digita abrt nella casella di ricerca e seleziona Trova. Seleziona il pacchetto abrt e applica le modifiche.
Configurazione di ABRT per Bugzilla
Vai su Applicazioni → Strumenti di Sistema → Strumento Automatico di Segnalazione Bug e selezionalo per avviarlo manualmente. Una volta che appare la finestra GUI, scegli Modifica → Plugin e dalla finestra Impostazioni, scorri verso il basso, evidenzia Bugzilla e scegli Configura Plugin. L’URL di Bugzilla dovrebbe essere https://bugzilla.redhat.com e inserisci il tuo login e password di Bugzilla nelle caselle appropriate.
|
Se non hai ancora un account Bugzilla, ora è il momento di crearne uno, vai all’URL come mostrato su quella pagina e crea un nuovo account. |
La prossima volta che hai un crash di programma e ABRT si attiva, quando premi Report, ABRT sarà in grado di accedere automaticamente a Bugzilla e inviare un Report di Bug per te.
Utilizzare ABRT
(Il seguente assume Gnome come desktop … qualcun altro dovrà aggiornare per KDE/Altri)
Se ABRT rileva un programma crashato, riceverai un avviso ABRT. Questo sarà indicato visivamente da una luce rossa lampeggiante nella tray di sistema. Clicca con il sinistro sulla luce di avviso, e lo Strumento Automatico di Segnalazione Bug dovrebbe avviarsi, mostrando tutti i crash che ha registrato. Per segnalare il bug, clicca con il destro su di esso e scegli report. ABRT raccoglierà i log necessari da inviare con il bug e ti informerà che sta per inviare un bug per tuo conto. Se hai configurato ABRT come nella sezione precedente, ti chiederà di verificare se includere o meno i vari log, poi andrà automaticamente su Bugzilla e aprirà un bug, allegando i log al bug. Ti mostrerà quindi il numero del bug in modo che tu possa tracciare il bug mentre viene lavorato.
Configurazione di ABRT quando mancano i Debuginfos
Quando clicchi con il destro su un bug in ABRT e scegli Report, ABRT tenterà di recuperare i log necessari da inviare come parte del report di bug. Gli sviluppatori hanno aggiunto codice per rilevare se le tracce simboliche sono incluse nella backtrace, e se rileva che non ce ne sono, ABRT ti avviserà e ti mostrerà il comando da eseguire. Questo è lo stesso di ciò che è mostrato nella sezione debuginfo.
Programmi in esecuzione come un altro utente
Se non ottieni alcun output da gdb dopo aver digitato thread apply all bt o bt, potrebbe essere perché il programma è eseguito come root o come un altro utente. In GNOME ad esempio, questo è il caso quando si esegue gnome-games. In tali casi, dovrai essere root per catturare una traccia. Quindi, esci da gdb, accedi come root e ripeti i passaggi per ottenere una traccia dello stack.
Firefox
-
Installa i pacchetti debuginfo di Firefox e Xulrunner - esegui
debuginfo-install firefox xulrunnercome root a riga di comando. -
Esegui
firefox -ga riga di comando. Questo avvierà firefox in esecuzione all’interno del debugger gdb. -
In gdb, dovresti vedere il prompt gdb
(gdb). Emetti il comandorun -safe-mode. Apparirà una finestra di dialogo, disabilita tutti gli add-on qui e continua in modalità sicura. -
Fai tutto ciò che è necessario per far crashare firefox e segui le istruzioni sopra per l’uso di gdb.
-
Quando Firefox si crasha, ottieni la backtrace e allegala a bugzilla.
Per informazioni aggiuntive vedi Linee guida per il debug dei prodotti Mozilla.
Thunderbird
È quasi lo stesso di Firefox, solo i pacchetti debuginfo sono diversi. Installali con il comando "debuginfo-install thunderbird" come root sulla console.
Per informazioni aggiuntive vedi Linee guida per il debug dei prodotti Mozilla.
Programmi Java
Vedi il documento Risoluzione problemi per Programmi Java per informazioni su come ottenere tracce dello stack da programmi in esecuzione in Java.
Daemon e i loro spawn
Dovrai raccogliere la backtrace dal file core.
Assicurati che lo script di init del tuo demone non impedisca il salvataggio dei file core sul disco. Aggiungi la riga DAEMON_COREFILE_LIMIT=unlimited al suo file di configurazione in /etc/sysconfig. Ad esempio, il demone Bluetooth (hcid) utilizza /etc/sysconfig/bluetooth.
Poi configura il kernel in modo che il core dump sia scritto in una posizione nota come /tmp. Come root, esegui:
echo /tmp/core > /proc/sys/kernel/core_pattern
Per rendere questo cambiamento permanente, aggiungi quella riga a /etc/sysctl.conf:
kernel.core_pattern = /tmp/core
E esegui sysctl -p per applicarlo immediatamente.
Un elenco completo di possibili pattern per il file core è disponibile nella documentazione del kernel sysctl/kernel.txt .
Infine, dopo aver riprodotto il tuo problema, puoi verificare due volte quale binario ha creato il file core con file /tmp/core.1234. Poi esegui gdb sul file per creare una traccia dello stack post-mortem:
gdb /path/to/binary/file /tmp/core.1234
e segui le istruzioni sopra per l’uso di gdb.
|
puoi testare se il dump di un file core funzionerebbe eseguendo |
Altri strumenti
Valgrind
Lo strumento brillante valgrind è spesso in grado di dire di più su cosa sta andando storto; può dare una traccia dello stack al punto in cui le cose iniziano ad andare male, che potrebbe essere molto tempo prima che il programma si crashi effettivamente. I programmi eseguiti attraverso valgrind eseguiranno un ordine di grandezza più lentamente e useranno più memoria, ma saranno incredibilmente utilizzabili.
Con valgrind installato (dnf install valgrind) puoi usarlo su un programma:
valgrind name-of-program program-arguments
Con debuginfo installato, le tracce dello stack useranno nomi simbolici. Vedi [http://valgrind.org/ valgrind.org] per maggiori info e trucchi.
strace
strace può tracciare tutte le chiamate di sistema fatte da un programma, che può anche essere utile nel debug, anche se non può produrre tracce dello stack. Installa con dnf install strace, e vedi man strace per dettagli.
La situazione è un po' migliorata. Ora la funzionalità traccia dello stack è implementata (strace -k). Anche se è disabilitata durante la compilazione perché l’implementazione non è stabile su i386.
Riferimenti
-
Molto del testo di questa pagina proviene dall’eccellente GNOME bugsquad su come ottenere tracce dello stack.
Want to help? Learn how to contribute to Fedora Docs ›