Debug remoto su target Linux con Eclipse

In questo articolo verrà spiegato brevemente come collegare il proprio progetto CDT Eclipse ad un target remoto contenente una distribuzione Linux embedded per effettuare le operazioni di debug step-by-step direttamente sul target.

La precondizione è che nella distribuzione Linux remota sia presente gdb o gdbserver:  sul target quest’ultimo controllerà l’esecuzione dell’applicazione mantenendosi in contatto verso l’ambiente grafico di debug utilizzando solitamente una connessione ssh sulla porta 2345. Lato macchina host, Eclipse CDT offre il front-end grafico che utilizza gdb fornito con il cross-compilatore (ad esempio per target PowerPC o ARM) per mostrare l’andamento dell’esecuzione sul target: è possibile inserire breakpoint, watchpoint, effettuare esecuzione step-by-step ed analizzare lo stato della memoria e dello stack, compatibilmente con le difficoltà consuete del debugging di applicazioni multi-thread.

Preparazione target

Lato scheda è necessario, rispetto al classico start-up, non lanciare l’eseguibile dell’applicazione che andremo ad analizzare ed impostare l’interfaccia di rete per comunicare con il pc host, il target deve quindi essere preparato al supporto per il debug ed ovviamente pingabile dal PC host.

Come si vedrà nel seguito, il front end grafico scarica automaticamente l’eseguibile da lanciare: nella versione per debug dovrebbe essere impostata l’opzione di ottimizzazione al minimo (-O0) per facilitare il debug passo-passo, difficoltoso a seguito delle ottimizzazioni introdotte dal compilatore. Seguire questo link per delucidazioni sull’utilizzo del compilatore gcc.

Compilazione eseguibile

L’eseguibile che si vuole lanciare sul target non deve essere ottimizzato e deve contenere i simboli di debug, è quindi necessario preparare una configurazione di build ad hoc che sia anche riconoscibile nel codice sorgente attraverso un qualche simbolo inserito nel makefile (es: introdurre l’opzione –DDEBUG sulla riga di comando del compilatore, poi –O0 e –g3). Il simbolo “DEBUG” se definito ci permetterà di inibire alcune funzionalità che impedirebbero l’esecuzione step-by-step (ad esempio una funzionalità di watchdog o la mascheratura del segnale SIGINT.

Impostazione Eclipse

E’ necessario installare il supporto per i target remoti, su Help > Install New Software, selezionare “– All available sites –” per i database da contattare per l’aggiornamento dei plugin di Eclipse. Dalla lista andare sotto “Mobile and Device Development” ed installare i pacchetti come in figura (se già installati potrebbero non comparire):

Eclipse remote development plugin
Eclipse remote development plugin

Bisogna quindi aggiungere una configurazione di debug specifica per il target remoto (se è stato utilizzato il progetto del repository SVN, è già presente la configurazione “Remote F0201”), selezionare il menu “Run > Debug Configurations … “, sulla sinistra andare in “C/C++ Remote Application” e premere l’icona con il “+” in alto a sinistra per creare la relativa configurazione:
Nel campo “C/C++ Application” selezionare il file preparato per il debug, mentre in “Remote Absolute File Path for C/C++ Application” inserire il path destinazione, nell’esempio il file viene scaricato in “/tmp” per velocizzare le operazioni di upload dell’eseguibile (nel mio caso la cartella /tmp era montata in RAM).

Debug configuration
Impostazione debug configuration

In basso assicurarsi di utilizzare “GDB (DSF) Automatic Remote Debugging Launcher”, se non è così risolvere il problema con il link “Select other…”. Se non viene selezionata la spunta “Skip download to target path”, allora l’eseguibile viene sempre scaricato sul target. Attenzione: non essendo stato riportato nel campo “C/C++ Application” il path assoluto dell’eseguibile (giustamente, per portabilità della configurazione) compare in alto l’errore “Program does not exist”, segnalazione ingiustificata in quanto sarà comunque possibile lanciare il debug selezionando questa configurazione.

Per impostare la connessione al target, premere il tasto “New…” (nella figura è già stata configurata una connessione chiamata “GWR – SSH”), quindi tra le selezioni disponibili utilizzare “SSH only” ed inserire l’IP del target.

Debug con GDB lato host

Sempre dalla schermata “Debug Configuration”, selezionare la tab “Debugger” e compilare il path di gdb che si trova nella cartella bin del Cross-Compiler. Per la configurazione di avvio di GDB lato host è consigliabile utilizzare uno script .gdbinit che contenga le seguenti istruzioni:

handle SIG32 nostop

handle SIG32 noprint

handle SIG33 nostop

handle SIG33 noprint

L e impostazioni funzionano se nella variabile PATH di sistema è presente il percorso del folder “bin” del cross compilatore (si può aggiungere nel file .bashrc nella home del proprio utente). Nella tab “Shared Libraries” selezionare il percorso di eventuali librerie dinamiche, purtroppo in questo caso è necessario mantenere il percorso assoluto della working copy locale, rendendo non portabile questa selezione. La tab gdbserver settings può essere mantenuta ai valori di default (viene specificata la porta 2345).

Configurazione debugger remoto
Configurazione debugger remoto

2 risposte a “Debug remoto su target Linux con Eclipse”

  1. Ciao,

    grazie per l’articolo. Molto interessante.

    Sto sviluppando un sistema similare che usa Debian su un ARM Atmel SAMA5. Riesco ad effettuare il debug da remoto senza problemi.
    L’unico fastidio che ho è questo: se la mia applicazione sta già girando sul target, appena cerco di far partire il debugger ho un errore.
    La cosa è logica, perchè appena Eclipse cerca di sovrascrivere il file dell’applicazione sul target si trova il file già occupato.
    Devo per forza chiudere il processo manualmente e poi ripartire col debugger.

    Secondo te c’è il modo di automatizzare la cosa ???

    Grazie.

    1. Ciao Roberto, grazie mille per il tuo commento. Ho paura di deluderti ma io in genere “preparo” il target in una configurazione tale da essere “comodo” per il debug, quindi in genere vado a modificare gli script di inizializzazione evitando di lanciare l’applicazione che stò sviluppando proprio per non dover eseguire le operazioni che mi hai detto. Potresti magari riservarti una scheda già pronta da utilizzare allo scopo. Un saluto

Lascia un commento