2013-01-03 17 views
6

Sono nuovo nella programmazione incorporata ma devo eseguire il debug di un'applicazione abbastanza complessa in esecuzione su una piattaforma integrata. Io uso GDB attraverso un'interfaccia JTAG.Come eseguire il debug dei problemi di memoria nell'applicazione incorporata

Il mio programma si arresta in modo anomalo a un certo punto in modo inaspettato. Suppongo che ciò accada a causa di un problema relativo alla memoria. GDB mi consente di ispezionare la memoria dopo che il sistema si è bloccato, quindi non risponde affatto?

+2

che tipo di processore stai usando? – TJD

+0

È un processore a 32 bit chiamato icyflex1 (http://www.csem.ch/docs/Show.aspx/9224/docname/CSEM-STR08-Page%2023.pdf) e sto utilizzando una toolchain basata su GNU. – ricc

+2

Sfortunatamente quel documento non menziona nulla sulle funzionalità della CPU per il debug. Come menziona Carl Norum, in genere si rileva un'eccezione, quindi si controlla lo stato della CPU. Ci sarà un modo specifico della CPU per determinare quale sia il PC quando si è verificata l'eccezione. Alcuni processori hanno registri di stato di debug/fault che ti diranno cose come l'indirizzo errato a cui è stato effettuato l'accesso e se si trattava di codice o bus dati. – TJD

risposta

6

Dipende dalla configurazione un po '. In particolare, dal momento che stai usando JTAG, potresti essere in grado di impostare il tuo debugger per arrestare il processore quando rileva un'eccezione (ad esempio, accedere alla memoria protetta illegalmente e così via). In caso contrario, è possibile sostituire i gestori di eccezioni con loop infiniti. Quindi è possibile srotolare manualmente l'eccezione per vedere cosa stava facendo il processore che ha causato l'arresto anomalo. Normalmente, hai ancora accesso alla memoria in quella situazione e puoi utilizzare GDB per guardarti intorno direttamente, o semplicemente scaricare tutto in un file in modo da poterti guardare in giro più tardi.

3

Dipende da cosa è andato in crash. Se il sistema non risponde (in alcuni loop infiniti, deadlock o simili), normalmente risponderà a GDB e sarà possibile vedere un backtrace (stack di chiamate), ecc. Se il sistema/bus/CPU ha effettivamente si è schiantato (a livello inferiore), quindi probabilmente non risponderà. In questo caso puoi provare a impostare i breakpoint in posizioni/variabili sospette e osservare cosa sta succedendo. Anche il simulatore (ISS, RTL - se applicabile) potrebbe tornare utile, per confrontare il comportamento con HW.

Problemi correlati