Debugging programmi con debian

C, C++, Java, ...

Debugging programmi con debian

Messaggioda Aki » 09/09/2018, 15:31

Il progetto Debian distribuisce, a seguito di proposta di un suo sviluppatore, oltre ai pacchetti "deb" per codice sorgente e pacchetti "deb" per programmi in formato binario, anche pacchetti contenenti i riferimenti (chiamati tecnicamente "debug symbols") necessari ad un "debugger" (programma di analisi del codice sorgente) per collegare il codice sorgente (in chiaro) al corrispondente codice e strutture dati in formato binario durante l'esecuzione del programma.

In particolare, il progetto Debian, a partire dalla versione 9.20151219 dello script debhelper, ha consentito ai "maintaners" (manutentori) dei pacchetti "deb" di istruire i sistema di archiviazione di pacchetti a generare per ciascun deb anche un pacchetto specifico contenenti i simboli di debug.

Tali pacchetti (il cui nome corrisponde a quello del pacchetto binario cui si riferiscono con l'appendice "-dbgsym") sono archiviati separatamente nei repository http://debug.mirrors.debian.org/debian-debug e http://snapshot.debian.org/.

Per poterli installare, è sufficiente configurare il gestore di pacchetti come indicato qui, ad esempio, nel caso della release testing, aggiungendo a /etc/apt/sources.list le seguenti righe:
Codice: Seleziona tutto
deb http://debug.mirrors.debian.org/debian-debug/ testing-debug main
deb http://debug.mirrors.debian.org/debian-debug/ testing-proposed-updates-debug main

Ad esempio, desiderando installare i simboli di debug del pacchetto coreutils, è possibile, dopo aver configurato il gestore di pacchetti, impartire il seguente comando:
Codice: Seleziona tutto
# apt-get install coreutils-dbgsym

I simboli di debug saranno installati al di sotto della gerarchia /usr/lib/debug/ (vedi il manuale di gdb per maggiori dettagli sulla collocazione e denominazione dei file di debug) dove il debugger dovrebbe essere già istruito a trovarli:
Codice: Seleziona tutto
$ dpkg-query -L coreutils-dbgsym
/.
/usr
/usr/lib
/usr/lib/debug
/usr/lib/debug/.build-id
/usr/lib/debug/.build-id/01
/usr/lib/debug/.build-id/01/6f3097e92be1aa115d5203debbe396e7a75efe.debug
/usr/lib/debug/.build-id/04
/usr/lib/debug/.build-id/04/c4b5d1f0ba90aeee6153f6181199555313548b.debug
[.. omissis..]

Se, ad esempio, a questo punto desiderassimo eseguire il debug del comando "du" presente nel pacchetto coreutils, possiamo scaricare il codice sorgente del pacchetto coreutils in una directory a nostro piacimento (nell'esempio sotto riportato, ho creato una cartella, $HOME/Scaricati) :
Codice: Seleziona tutto
$ cd $HOME
$ mkdir -p Scaricati
$ cd Scaricati
$ apt-get source coreutils

A questo punto, presupponendo che sia già installato un debugger (ad esempio, gdb) è possibile impartire il seguente comando:
Codice: Seleziona tutto
$ gdb /usr/bin/du -d $HOME/Scaricati/coreutils-8.28/src/ --tui

dove:
    /usr/bin/du è il programma in formato binario da sottoporre a debug

    -d $HOME/Scaricati/coreutils-8.28/src/ è la posizione del codice sorgente di tutti i programmi del pacchetto coreutils (nel caso dell'attuale debian testing)

    --tui è una particolare modalità di funzionamento del debugger
Aki
Global Moderator
Global Moderator
 
Messaggi: 8088
Iscritto il: 27/12/2007, 16:59

Re: Debugging programmi con debian

Messaggioda Aki » 09/09/2018, 16:05

L'output ottenuto è il seguente, con posizionamento del debugger gdb alla prima riga (riga num. 724 del file sorgente du.c) della funzione "main" (programma in C):
Codice: Seleziona tutto
   ┌──src/du.c─────────────────────────────────────────────────────────────────────┐
   │723     {                                                                      │
   │724       char *cwd_only[2];                                                   │
   │725       bool max_depth_specified = false;                                    │
   │726       bool ok = true;                                                      │
   │727       char *files_from = NULL;                                             │
   │728                                                                            │
   │729       /* Bit flags that control how fts works.  */                         │
   │730       int bit_flags = FTS_NOSTAT;                                          │
   │731                                                                            │
   │732       /* Select one of the three FTS_ options that control if/when         │
   │733          to follow a symlink.  */                                          │
   │734       int symlink_deref_bits = FTS_PHYSICAL;                               │
   │735                                                                            │
   │736       /* If true, display only a total for each argument. */               │
   │737       bool opt_summarize_only = false;                                     │
   │738                                                                            │
   └───────────────────────────────────────────────────────────────────────────────┘
exec No process In:                                                    L??   PC: ??
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/du...Reading symbols from /usr/lib/debug/.build-id/53/
12bda97fd75cdbd58ce76e607e2de3429b916a.debug...done.
done.
(gdb)
Aki
Global Moderator
Global Moderator
 
Messaggi: 8088
Iscritto il: 27/12/2007, 16:59


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite