Home
Accesso / Registrazione
 di 

Debugging avanzato per Linux embedded

Debugging avanzato per Linux embedded

Il debugging avanzato per linux embedded diventa semplice con i Trace32 di Lauterbach. Trace32 è una famiglia di debugger che supporta le tecnologie come JTAG, BDM, NEXUS o ETM con debugger integrati, trace software e hardware, sistemi di analizzatori logici per più di 3500 core e CPU con 250 famiglie come ARM9, ARM11, Cortex, PowerPC, MIPS, TriCore, ecc.

Trace32 è un sistema universale progettato specificatamente per fornire un ambiente completo integrato con le prestazioni e la flessibilità che fissano nuovi standard per i progettisti che si occupano di debugging avanzato su sistemi ARM/Linux.
La necessità di utilizzare architetture di CPU multicore deriva dall'intento di capire e risolvere i problemi di consumo energetico e conseguente dissipazione di calore, che nascono quando la frequenza di lavoro di una CPU a singolo core aumenta. Poi il desiderio tecnologico di ridurre la geometria di un chip fa aumentare i problemi di progetto, causati da effetti parassiti come effetti capacitivi e correnti di dispersione.
 

Debugging avanzato per Linux EmbeddedIl 19 Aprile a Milano si terrà un seminario proprio sulle tecniche avanzate
di debugging per sistemi ARM/Linux.
Il seminario è riservato alle aziende, questo il programma ed il modulo di registrazione: tecniche avanzate di debug per sistemi multicore [PDF]

 

Debugging multicore avanzato: dentro il problema!

Un primo passo per risolvere questi problemi è definire nuove architetture di CPU con superpipeline oppure di tipo superscalare. Nell'architettura di CPU con superpipeline si riduce ogni stadio della pipeline in unità più piccole. Nella seconda, di tipo superscalare, si aumenta il numero di pipeline facendole lavorare in parallelo. Ma questo porta altri problemi, in particolare riguardo alle condizioni di stallo della pipeline e della complessità della sincronizzazione.

Un altro "trend" è quello di aumentare le unità ALU (logico-aritmetiche), rendendo così possibile l’elaborazione contemporanea di più istruzioni, ciascuna delle quali opera su dati diversi. In questo caso parliamo di architettura MIMD (multiple instruction multiple data). L’architettura MIMD a singolo core risulta comunque molto complessa a livello progettuale. La soluzione adottata per risolvere questi problemi è quella di sviluppare architetture multicore vere e proprie, realizzando così diverse unità più piccole al posto di una sola più grande.
Così la complessità di progetto si sposta dal singolo core al sistema di comunicazione e di bilanciamento del carico di elaborazione dei core.

Dal punto di vista energetico, la disponibilità di più core permette anche lo spegnimento temporaneo delle unità meno attive. Questo risulta molto più semplice rispetto allo spegnimento di singoli circuiti di un solo core. In più i core di una CPU possono anche essere realizzati in modo asimmetrico, dedicando ogni singolo core a un compito specifico (è frequente il caso in cui una CPU multicore sia composta da un’unità microcontrollore e da un processore DSP). Se il bilanciamento del carico di lavoro non si è realizzato a livello hardware, la potenza elaborativa delle architetture multicore può essere sfruttata solo se esiste un supporto da parte di un sistema operativo.

Il multiprocessing può quindi essere classificato in due modi:

    - sono possibili soluzioni asimmetriche (AMP) in cui l’assegnamento dei task a un singolo core è definito univocamente in fase progettuale;

    - oppure soluzioni simmetriche (SMP, symmetrical multiprocessing) in cui ogni task è assegnato a un core dinamicamente, da parte di un sistema operativo SMP, sulla base di politiche di assegnamento definite nel sistema operativo stesso. In questo caso tutti i core devono essere dello stesso tipo.

Debugging avanzato: AMP e SMP

Lauterbach supporta il debug di sistemi asymmetrical multiprocessing (AMP) mediante istanze separate del software Trace32, una per ogni core.
Per il debug di sistemi AMP viene avviata una singola istanza di TRACE32 per ogni core.
Per il debug di sistemi symmetrical multiprocessing SMP, Lauterbach fornisce una singola istanza del software TRACE32 in grado di controllare tutti i core. L’interfaccia utente mostra le informazioni d’interesse per il debug di un’applicazione, riconoscendo in modo automatico il core su cui è allocata.

Per il debug di sistemi SMP una singola istanza di TRACE32 controlla tutti i core.

Trace AMP e SMP

Il trace real time di un'applicazione permette di capire in modo rapido e sistematico condizioni di malfunzionamento particolarmente complesse, che si verificano solo in condizioni runtime. È anche possibile ottenere informazioni statistiche, come ad esempio l’analisi di copertura del codice eseguito e (avendo a disposizione anche informazioni sul tempo di esecuzione) il profiling della durata delle singole funzioni, in modo da verificare la corrispondenza con eventuali requisiti temporali. 

Linux awareness: debug con TRACE32

Il riconoscimento delle strutture dati rilevanti di un sistema operativo e dei suoi meccanismi di gestione delle risorse (awareness) permette a un debugger di offrire all’utente funzionalità avanzate di controllo del software.
Nel caso di Linux utilizzato su sistemi embedded, i debugger Lauterbach forniscono un’integrazione molto sofisticata con il sistema operativo, in grado di mostrare le condizioni di utilizzo delle principali risorse allocate.
Per garantire queste funzionalità, l’awareness riconosce la configurazione dell’MMU del processore, sapendo che Linux opera in uno spazio di memoria virtuale.

Si noti che il meccanismo di demand paging di Linux comporta che un’applicazione possa essere fisicamente non presente in memoria, fintanto che le singole pagine contenenti istruzioni o dati non vengano richieste per l’esecuzione. Il supporto a Linux in Lauterbach permette di effettuare il debug di un processo utente a partire dal suo avvio. Se il processo utilizza librerie dinamiche (shared objects) Linux le carica nello spazio di indirizzamento del processo. Occorre tenere presente che anche le librerie dinamiche vengono caricate da Linux nel momento in cui le loro istruzioni sono utilizzate per la prima volta.

Con i debugger Lauterbach è inoltre possibile il debug dei threads che compongono un processo. In questo caso è sufficiente caricare una sola volta le informazioni simboliche associate al processo. Il kernel di Linux è compilato in modo da consentire il collegamento di moduli aggiuntivi, che possono essere caricati dinamicamente. Con Lauterbach è possibile effettuare il debug di un modulo a partire dalle funzioni di inizializzazione.
È inoltre facilitato il debug delle eccezioni di segmentation violation, mediante l’assegnamento dei breakpoint necessari per identificare l’eccezione e la possibilità di caricare temporaneamente i registri del processore con lo stato macchina che ha provocato l’eccezione, così da facilitare l’analisi del problema. Al momento in cui l’esecuzione viene ripresa, vengono ripristinati i registri originali.
È anche possibile associare dei breakpoint a un singolo task ed eseguire per un singolo task il trace del flusso di programma.
Nel caso in cui il processore fornisca funzionalità di trace dei dati, è possibile tracciare il cambio di contesto dei singoli task, con il supporto del sistema operativo.

L’awareness di Linux permette di esaminare l’utilizzo delle risorse del sistema operativo, come ad esempio i task in esecuzione

Android

Nelle applicazioni Android, in ambito embedded, esistono molte situazioni in cui non è sufficiente eseguire il debug della sola applicazione Java. Si tratta ad esempio di casi in cui è necessario modificare dei componenti di sistema, come lo stack di rete, oppure analizzare l’interazione fra un’applicazione e un driver di basso livello. Si pensi anche a casi di analisi post mortem, in cui è necessario studiare lo stato di un sistema che ha appena subìto un crash inatteso, per ricostruirne le cause. È inoltre comprensibile come risulti difficile integrare in uno stesso ambiente il debug del codice nativo e il debug del codice Java. Si tratta di due tipi diversi di codice, eseguiti diversamente fra loro e non riconducibili l’uno all’altro in modo elementare. I debugger Lauterbach forniscono un ambiente che permette il cosiddetto stop mode debugging, ovvero la possibilità di fermare il processore che esegue la macchina fisica, congelando dunque in uno stato ben definito la piattaforma che contiene il sistema operativo e le applicazioni in esecuzione, in modo da consentirne un’analisi tramite il debugger. Tutte le soluzioni per il debugging dei sistemi Android, verranno presentate al seminario.

Partecipa al seminario del 19 Aprile a Milano. Il seminario, riservato alle aziende, è gratuito. Scarica il programma in PDF

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di FlyTeo

Spettacolo!

Caspita!! Questo è un debugger serio! Permette di fare praticamente ogni cosa!!

ritratto di slovati

Lauterbach

Nel campo degli emulatori e degli strumenti di debugging in generale, Lauterbach non ha bisogno di presentazioni. Si tratta di un marchio famoso in tutto il mondo per la qualità e l'affidabilità dei suoi prodotti. TRACE32 è un ottimo tool di debugging disponibile per una vasta gamma di microprocessori e microcontrollori a 32 bit, tra i quali l'ARM9. come noto, i processori ARM Cortex-A9 sono disponibili sia nella configurazione tradizionale single-core che in quella scalare multicore (MPCore). TRACE32 permette di eseguire il debugging anche delle architetture multicore, e di avere il pieno controllo della CPU (tramite interfaccia JTAG), di esaminare tutte le aree di memoria ed i registri, ed eseguire anche il debugging del codice di boot (boot loader). Ciò consente di utilizzare lo strumento anche per supportare lo sviluppo ed il debugging di device driver e di processi Linux, con supporto anche per la piattaforma Android.

ritratto di Antonio Mangiardi

pensavo che esistesse solo il

pensavo che esistesse solo il Jtag per il debug e che fosse uno standard...
BDM, NEXUS ed ETM sono tipo il jtag o si appoggiano ad esso?

ritratto di Fabrizio87

io pensavo che sistema

io pensavo che sistema operativo linux avesse già incorporato in sé un sistema debugging .

ritratto di Giovanni Giomini Figliozzi

per prima cosa complimenti

per prima cosa complimenti per l'articolo, davvero chiaro e ben fatto. nulla da aggiungere o obiettare. Questo debugger sembra davvero una bomba! io ho avuto esperienza di debugging "a basso livello" solo con gnu insight, ma mi sembra che qua stiamo proprio un passo avanti! I numeri dell'articolo sono impressionanti! 3500 core e 250 famiglie diverse. Ora il pensiero che mi viene è che un sistema di debugging di questo tipo dovrebbe essere destinato ad un utilizzo strettamente (ed anche esclusivamente direi) industriale. Ma quanto può costare l'acquisto di un pacchetto del genere?
Peccato che il seminario si svolga a milano, un pò lontano per me che sto nel lazio, altrimeni sarei andato a vedere. (non importa che è riservato alle aziende, mi calo dal tetto)

ritratto di linus

mi spieghi

Mi spieghi come visto che l'edificio è alto 70 metri ed è in pratica un parallepipedo, dovresti come minimo avere un aliante o un elicottero per calarti dall'alto.

ritratto di Giovanni Giomini Figliozzi

per arrivare in cima pensavo

per arrivare in cima pensavo a una mongolfiera, poi il resto ce lo ha insegnato mission impossible :P
http://ia.media-imdb.com/images/M/MV5BNDgwMzU1NjEzNV5BMl5BanBnXkFtZTcwMzE0NTY3Mw@@._V1._SX...
che dici, è fattibile come cosa?

ritratto di FlyTeo

;-)

Secondo me un jetpack conviene XD

Scherzo ;-)

ritratto di Francesco12-92

Gran bel debugger, permette

Gran bel debugger, permette di fare tante cose, tra cui anche sperimentare per conoscere sempre di più come funzionano i sistemi elettronici e in quali problemi si incorrono nel costruirli. Per il fatto dei microprocessori è proprio vero, ormai di spazio c'è ne sempre di meno, e oltre al problema di. Componenti parassiti come capacità, resistenze, transistori il vero problema rimane anche la possibilità di isolare i diversi transistori di base sulla piastrina di silicio, senza che si crei un corto tra di loro, e quindi porducendo un chip danneggiato, ma le tecniche di produzione stanno al passo e permettono di farlo sempre di più, basti pensare all Intel che stava sperimentando la tecnica di produzione molto più piccola e si è dovuta fermare solo a causa del terremoto in Giappone.

ritratto di Giovanni Giomini Figliozzi

un paio di cose: 1) questo è

un paio di cose:
1) questo è indubbiamente un ottimo sistema di debug, ma il debug in questo senso è più roba da informatici... Chi lo usa potrebbe anche non sapere cosa è un transistor o cosa è una capacità, ma gli "basta" saper leggere tra i vari indirizzi di memoria ecc.
2) fa un poco sorridere quel "solo" del terremoto in giappone

ritratto di FlyTeo

Aspetta aspetta...

Aspetta aspetta...
Potrei ribatterti a riguardo del fatto che un informatico non può prescindere dal conoscere l'elettronica che c'è sotto. Non può. Io la vedo così e tanti miei professori che me la spiegano. Inammissibile non sapere cos'è un transistor anche se parli e scrivi solo in C =)

ritratto di Giovanni Giomini Figliozzi

guarda, ti posso dire la mia

guarda, ti posso dire la mia esperienza... Ho iniziato a programmare in quick basic a 11 anni, a 14-15 ho scritto qualche programmino stupido in c++, da 15 ad oggi ho scritto un fiume di codice in php, html e un pò di css e javascript, a 19 anni ho imparato abbastanza bene il C e ancora lo uso, e a 20 anni ho scritto un bel pò di codice assembly per pic. poi ho conosciuto arduino ecc. Ho iniziato ad avere una formazione di tipo elettronico a 20 anni (vengo da un liceo classico), e ho scritto tutto questo codice senza sapere come funzionasse un transistor, e senza avere basi di fisica. Non è detto che sia giusto così. sono convinto che anche gli informatici debbano almeno sapere cosa c'è dentro un processore, con almeno dei fondamenti di elettronica digitale. Tuttavia non lo ritengo necessario alla programmazione in se e per se. Quando uno ha davanti un debugger può vedere tante cose, tra cui ad esempio in che parte dello stack o dello heap sono allocate variabili o altro, che funzione è in esecuzione, tempi di esecuzione, ma non è possibile in sede di debug del software nemmeno pensare di mettersi a vedere le capacità parassite o... che ne so... le correnti di polarizzazione dei transistor (che in cmos sono pressappoco zero, ma era per fare un esempio)
Ribadisco: va molto bene se un informatico sa con quali strumenti sta lavorando, ma questo non pregiudica in maniera eccessiva il suo lavoro (questa cosa è vagamente collegata al motivo per il quale ho scelto ing. elettronica)

ritratto di FlyTeo

D'accordo..

Perfetto. Sono pienamente d'accordo sulla tua ultima frase. La bravura dell'informatico (io ho scelto ing. informatica :P ) non è legata alla conoscenza dell'elettronica in sè. Altrimenti perderesti il tuo lavoro..

Quello che volevo semplicemente dire è che un buon informatica deve sapere bene come lavora, su cosa lavora. Poi, per carità, nessuno gli vieta di conoscere soltanto scrivere programmi. Magari è dieci volte più bravo di uno che conosce l'elettronica :)
E' tutta una questione personale secondo me, un punto di vista davvero personale legato anche alla formazione che uno ha avuto =)

ritratto di Antonio Mangiardi

un autista non è per forza un

un autista non è per forza un meccanico ...ma è bello se ti si rompe la macchina saperla aggiustare :)

ritratto di Giovanni Giomini Figliozzi

paragone azzeccatissimo

paragone azzeccatissimo

ritratto di Antonio Mangiardi

giovanni, il pilota che ne

giovanni, il pilota che ne capisce sa migliorare la macchina e aiutare i meccanici... io ho scelto elettronica perchè non mi piace programmare ma ultimamente mi sta piacendo anche quello :) il tuo percorso è al contrario del mio, ho iniziato con assembly per arrivare, per ora al C++ ma sono interessato al java viste le cose che si possono fare.. hai qualche dritta da darmi per entrare nello sviluppo di java o php? mi sembrano simili a C++ ma cosa puoi farci realmente?

ritratto di FlyTeo

Java

Java sta anche alla base di android se vuoi un'idea. E da java arrivano i javascript, che sono importanti in internet. Ti dico che , conoscendo il c++, il passaggio a java sarebbe veramente facile.

I server delle banche ad esempio si appoggiano su java. A livello di business è una conoscenza molto richiesta. Inoltre il suo grande pregio è che ha origine da un bytecode, differentemente dal c++ ed è molto portabile. A livello accademico si parte sempre da java. =)

ritratto di Antonio Mangiardi

davvero da te si parte dal

davvero da te si parte dal java? grazie delle info, ma il bytecode cosa è? i comandi sono codificati in 8 bit?

ritratto di FlyTeo

Java..

A livello universitario si studia il C. E' fondamentale, direi. è impossibile conoscerlo. Volevo intendere che si parte da Jav per imparare a programmare ad oggetti. Non si passa da c a c++ o ad altri linguaggii. Java è l'esempio di programmazione per gli oggetti.
Per quanto riguarda il bytecode. Conosci il c? allora, tu compili il sorgente e da esso viene generato il linguaggio macchina, in assembler per intenderci ;-)
Il java funziona in modo diverso. Dal sorgente viene creato il bytecode. E questo viene poi tradotto in linguaggio macchina.
Il bytecode viene generato da un software particolare detto runtime. Questo bytecode poi viene tradotto in assembly con la java virtual machine. Questo rende java portabile, ovvero può essere eseguito su ogni tipo di architettura senza la necessità di doverlo ricompilare ogni volta. Per intenderci, io scrivo il mio sorgente in java e lo compilo, creando il bytecode. Poi lo passo a te e tu lo "virtualizzi", adattandolo alla tua macchina. In questo modo tu non viene a sapere il contenuto del sorgente ma ti si crea solo l'eseguibile. In C questo non è possibile.
E' una caratteristica molto importante. Credo che sia questo che rende java così diffuso, invece porta il C ad essere usato solo dove c'è bisogno di un basso livello.

Java è bellissimo. Credo sia più complesso del C ma credo comunque che sia totalmente diverso, non paragonabile. E' un mondo a sè e deve piacere, così come deve piacere quello del C o di altri programmi, altrimenti resterà sempre difficile da capire ;-)

Da me il corso di Java si chiama "Ingegneria del software" XD

ritratto di Antonio Mangiardi

ripeto da me si fa il C++

ripeto da me si fa il C++ anche detto il C con classi e anch'esso è orientato a oggetti.. credo di aver capito il perchè, il professore ci fa quello--> si impara il C (che va benissimo per programmare i microcontrollori) e ti da le basi per imparare anche i linguaggi tipo java che sono solo a oggetti.. :) grazie delle info e spiegazioni

ritratto di FlyTeo

Programmazione..

Alla fine imparare un linguaggio è abbastanza facile. L'unica difficoltà è capire il modo di ragionamento che ci sta dietro e farti entrare in testa il paradigma di programmazione.. Tutto qui.
Felice di esserti stato utile =)

ritratto di Giovanni Giomini Figliozzi

io ho cominciato all'uni con

io ho cominciato all'uni con il c, e mi sembra giusto, visto che il Cpermette di capire meglio il funzionamento del computer, mentre in java non ci si capisce mai una mazza
comunque vorrei precisare una cosa sul javascript: nel tempo in cui internet stava nascendo, cominciava a farsi vedere anche il java. java è nato prima del javascript, e a questo è stato dato un nome e una sintassi più o meno simile, per ragioni commerciali, per fare in modo che javascript sfruttasse lo slancio mediatico che stava avendo java in quel periodo. Non chiedetemi la fonte di questa informazione perchè non me lo ricordo proprio...

ritratto di Antonio Mangiardi

il javascript

è stato sviluppato da Brendan Eich della Netscape Communications, col nome Mocha e successivamente di LiveScript, ma in seguito è stato rinominato "JavaScript" ed è stato formalizzato con una sintassi più vicina a quella del linguaggio Java

http://it.wikipedia.org/wiki/JavaScript#Java.2C_JavaScript_e_JScript

Il cambio di nome a JavaScript si nel periodo in cui Netscape stava includendo il supporto Java nel suo browser Netscape Navigator.... Non c'è una vera relazione tra Java e JavaScript. le loro somiglianze sono soprattutto nella sintassi derivata dal linguaggio C in entrambi i casi ..

ritratto di Giovanni Giomini Figliozzi

A me piace programmare, e ho

A me piace programmare, e ho scelto elettronica perchè non voglio fare per mestiere anche quello che faccio per passione. (ora però ho anche la passione dell'elettronica, sarà un problema :D) Ho scelto elettronica anche perchè sono convinto che se uno sa maneggiare un circuito, la programmazione può mangiarla a colazione.
Per quanto riguarda java, l'ho odiato con tutto il cuore. Il mio corso si chiamava progettazione del software e grossomodo riguardava java e uml. È uno dei pochi corsi che non ho seguito per intero. Non mi andava proprio di perdere tempo dietro un linguaggio che addirittura non conosce il tipo dati "int", o meglio, è inutile perchè per poterlo modificare va creata una classe apposta... E comunque già non vado pazzo per la programmazione a oggetti, anche se ne riconosco l'utilità in molti casi, poi java è solo fatto da oggetti, e allora non mi ci sono mai appassionato. L'esame l'ho preparato in 3 giorni: 2 per l'uml e uno per il linguaggio. mi sono preso il mio 26 e tanti saluti :D
Il prof aveva qualcosa come un migliaio di dispense, impossibili da leggere tutte, dato che trattavano ogni caso possibile e immaginabile di hashset, liste, iteratori ecc. Allora ho letto un pò di dispense e ho integrato dando un'occhiata sul sito della sun (che se non ricordo male era appena acquisita dalla oracle), e ho visto un pò i metodi disponibili sulle varie classi. Per fortuna avevano nomi uguali, e lo sforzo di memoria non è stato eccessivo. Mi è piaciuto quando il prof abituato a vedere sempre gli algoritmi delle sue dispense ha detto: "beh, questo metodo di risoluzione non è quello che propongo di solito... bisognerebbe testarlo per vedere se funziona, però mi piace l'originalità. ti do un punto di più" che spettacolo!! XD
Lasciando da parte la mia antipatia, java lo vedo molto adatto a creare programmi che necessitano di un'interfaccia grafica e che non abbiano bisogno di una quantità sterminata di risorse. È risaputo che java occupa un sacco di ram e di risorse di calcolo per cose che in c si farebbero con 4 byte e 2 cicli di clock

Per il php, anche se da un pò di tempo c'è il modo di usarlo per creare applicazioni adatte al desktop, questo non lo fa praticamente nessuno, e l'utilizzo del php è "limitato" al web (se è un limite). È un linguaggio di una comodità senza limiti. Puoi fare con una riga di codice cose che in altri linguaggi ci perderesti le giornate dietro. esempi puoi creare array utilizzando come indice una stringa. es
$ar = array( "asd" => "lol",
"pippo" => "pluto");
puoi aggiungere elementi scrivendo ad esempio $ar[]="qwe"; senza dover allocare o riallocare niente
ci sono cicli come il foreach che permettono di scorrere tutto l'array automaticamente
se hai un dato di tipo intero e una stringa con un numero, il casting è implicito e puoi confrontarli!
es: "123" == 123 restituisce 1 logico.
puoi usare una variabile che si chiama come il valore contenuto in un'altra variabile
es $asd = "aaa";
$aaa= "pippo":
echo $$asd //restituisce pippo
Il php permette l'utilizzo delle espressioni regolari perl compatibili (pcre) che sono di una potenza assurda! ti faccio un esempio da un mio programmino
$pattern= '/From: (([^<]+)<\+?([^>]+)>)[^:]+: ([0-9\/]+)[^:]+: ([0-9:]+)/';

Comunque c'è da dire che per riuscire a fare qualcosa di utile con php, bisogna conoscere anche un pò di html, altrimenti non te ne fai molto

ritratto di Antonio Mangiardi

vabbè mi devo fare ancora un

vabbè mi devo fare ancora un po di cultura, il mio esame che l'INFORmazione autoMATICA si chiama "informatica e calcolatori" tratta il C++ e grossomodo i sistemi operativi e l'architettura, ma io mi son fermato al punto in cui fa le classi, mi son preso male e ho deciso di fare altro e informatica farla dopo :)
ma oramai sta arrivando il momento di fare anche lei...

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 4 utenti e 37 visitatori collegati.

Ultimi Commenti