Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-06-2005, 17:43   #1
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Storia di un bug

E' stata una giornata frustrante e mi sfogo con voi perche' odio scrivere i blog

Alla fine della storia c'e' anche una lezione banale che ho imparato a mie spese e che condivido.

Ieri ero a caccia di un bug che causava una doppia distruzione di un oggetto 3d che rimane per qualche motivo ancora in giro per il mondo e causa un crash dell'applicazione.

Problema classico, anche la soluzione e' piuttosto classica: si aggiunge un sanity check alla classe e si controlla che la classe sia "sana" sempre prima di usarla. Al primo uso di una classe "malata", il sanity check informa il programmatore che puo' facilmente risolvere il problema alla radice.

Armato di quest'idea scrivo il sanity check e aggiungo il codice necessario in C++:

Prima aggiungo un campo che contenga una firma nota alla classe:

Codice:
	unsigned int					mSign;
Inizializzo il campo nel costruttore:

Codice:
	, mSign(MODEL_ENGINE_SIGN)
Scrivo un metodo di test per controllare che l'oggetto sia "sano":

Codice:
bool ModelInstance::Test(void) const
{
	if (MODEL_ENGINE_SIGN != mSign)
	{
		return false;
	}

	if (!CheckMatrixSanity(*mModelMatrix))
	{
		return false;
	}

	return true;
}
Faccio il check in e vado a dormire, sperando che all'indomani il mio sanity check fallisca indicandomi chi sta "rovinando" il mio oggetto.

Oggi mi piovono addosso alcuni bug totalmente scollegati l'uno dall'altro, oggetti che scompaiono quando sono costruiti, bandiere che non possono piu' essere prese in mano e scompaiono quando non devono.

Ovviamente non collego mentalmente i bug al cambiamento di ieri perche' non hanno apparentemente alcun collegamento logico, visto che quello che il codice che ho aggiunto non ha alcun effetto collaterale, non e' altro che un controllo.

Vi risparmio le 6 ore di ricerche che hanno coinvolto quattro o cinque persone ed un paio di tester per arrivare alla conclusione che si', aggiungere un campo ad una classe, ha causato tre bug apparentemente totalmente scollegati in porzioni del gioco lontane mille miglia e che capitano solo in condizioni particolari, non sono totalmente ripetibili.

Allo stato attuale delle cose, non so il perche' cio' accade, ho dovuto togliere i sanity check perche' i bug "scompaiano" e passero' la serata per capire il perche' e' accaduto, dove sia davvero il bug e perche' quelle righe di codice lo hanno scatenato.

Questa storia mi ha insegnato e confermato tre lezioni importanti:

1) Un cambiamento innocente puo' provocare bug apparentemente completamente scollegati e imprevedibili, che solo adeguato testing puo' scovare: questa volta sono stato relativamente fortunato che i bug erano molto evidenti, ma non saro' sempre cosi' fortunato ed il bug puo' potenzialmente uscire allo scoperto il giorno prima della Gold.

2) Senza scendere nei particolari suppongo (ma non so di preciso), che il bug sia dovuto a qualche campo non iniziallizato: inizializzate tutte le variabili e i campi delle classi quando create l'oggetto per evitare brutte sorprese. C# e linguaggi a piu' alto livello lo fanno per voi. E c'e' un perche'.

3) Il C++ e' potente e flessibile, ma questa potenza e flessibilita' arrivano al costo di ore e ore di debugging alla ricerca di problemi non intuitivi come questo.

Spero che questo post vi sia utile per evitare lunghe nottate di debugging come quella che mi aspetta oggi. Torno a caccia

PS. Fare Sanity check spesso e volentierie e' una buona idea comunque.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2005, 18:49   #2
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Mi è capitato due volte di aver a che fare con sti bug assurdi nella mia brevissima cariera. Hai tutta la mia comprensione.

Buona fortuna.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2005, 18:57   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Ti metterai e vi metterete sicuramente a ridere confessandovi che è il problema che ho attualmente io con una delle mie piccole applicazioni....solo che, il mio sorgente è lungo si e no 200 righe!!! e cmq non riesco a gestire e a capire ancora con certezza assoluta dove diavolo sta l'errore

Dico questo perchè mi rendo conto che, avendo voi a che fare con sw complessi, lunghi e anche con parti "slegate" fra di loro, di certo i mal di testa non vi mancano.

Che ti posso dire, se avessi la possibilità ti manderei qualche mia amica non troppo "pudica" a sollevarti il morale
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2005, 20:14   #4
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da RaouL_BennetH
Ti metterai e vi metterete sicuramente a ridere confessandovi che è il problema che ho attualmente io con una delle mie piccole applicazioni....solo che, il mio sorgente è lungo si e no 200 righe!!! e cmq non riesco a gestire e a capire ancora con certezza assoluta dove diavolo sta l'errore
Sai che non mi piace quando fai il modesto

Soprattutto se sapessi che razza di idiozia ho scritto per introdurre il bug.
Ho scritto questa cosa qui all'interno della definizione di una classe in un header file in C++:

Codice:
#ifdef _DEBUG
std::string name;
#endif
Lo stesso header file e' incluso in due punti diversi del codice con _DEBUG definito e non, quindi due parti diverse del programma non sono d'accordo su come l'oggetto e' strutturato in memoria (con o senza il campo 'name'). E questo causa problemi vari ed eventuali e imprevidibili a distanze siderali.

Lezione del giorno: usare la compilazione condizionale all'interno della definizione di una classe in un header file non e' una buona idea.

Quote:
Che ti posso dire, se avessi la possibilità ti manderei qualche mia amica non troppo "pudica" a sollevarti il morale
Io sarei anche d'accordo, la mia ragazza meno. Ritratto, io non sarei d'accordo (caso mai leggesse ).
fek è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2005, 16:13   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Ah... i problemi con la memoria... che belli! Pensa quando ti trovi con una variabile passata come argomento (puntatore) ad una funzione e che è stata allocata in un'altra funzione e deve essere ridimesionata... ora sto sbattendo la testa su una cosa del genere in C, ma con pochi risultati.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 09-06-2005, 21:10   #6
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112

all'inizio credevo fosse la storia di windows
cmq pure è capitato qualcosa di simile... avevo aggiunto del codice x cercare di capire quale fosse il problema..... e non funzionava più un cazzo!
Cmq onestamente devo dire ke ASP.NET se scritto utilizzando il Visual Basic è veramente da suicidio.... (soprattutto se 6 un programmatore JAVA CAZZO! )
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 00:04   #7
CoreDump
Senior Member
 
L'Avatar di CoreDump
 
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
Bello sto 3d Fek , comunque concordo pienamente su tutti e tre i punti,
ovvero :

1) mi è successa una cosa simile un paio di anni fà, un errore
su un progetto piuttosto grande sotto linux, gdb in mano ci ho messo giorni a capire
dove era il problema, ho dovuto sezionare il programma riga x riga, mai sudato
tanto anche perchè era un progetto di lavoro e il capo stava già facendo
la punta al suo arnese

2) Io lo faccio sempre infatti, basta un puntatore non inizializzato a farti
perdere ore di lavoro, l'ho imparato a mie spese

3) Completamente d'accordo, ma non posso fare a meno della libertà di
implementazione che offre il c++, ovviamente imho

ciauz.
__________________
Puffo Programmatore su Puffolandia Groups
Il Software è come il Sesso, è meglio quando è Libero
CoreDump è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 15:07   #8
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
Quote:
Originariamente inviato da DanieleC88
Ah... i problemi con la memoria... che belli! Pensa quando ti trovi con una variabile passata come argomento (puntatore) ad una funzione e che è stata allocata in un'altra funzione e deve essere ridimesionata... ora sto sbattendo la testa su una cosa del genere in C, ma con pochi risultati.
tradotto?
ri è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 15:24   #9
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da CoreDump
3) Completamente d'accordo, ma non posso fare a meno della libertà di
implementazione che offre il c++, ovviamente imho
Mi piace questo punto. Perche' non usare la liberta' e la flessibilita' solo dove serve? Si unisce il buono dei due mondi: C/C++ dove serve la flessibilita', Java/C#/Python/Ruby dove la flessibilita' non ti serve, ma vuoi produttivita' e tranquillita'.

Sto entrando nell'ottica che non e' strettamente necessario usare un solo linguaggio per tutto il progetto, ma lo strumento giusto al momento giusto. Poi serve la colla per unire i vari linguaggi.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 16:12   #10
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da ri
tradotto?
Esempio:
Codice:
int main()
{
  tipo * variabile;
  altro * test;

  chiamatachealloca(&variabile);
  chiamatacheaggiunge(&variabile,test);
}

void chiamatachealloca(tipo ** x)
{
  x = malloc(grandezza);
}

void chiamatacheaggiunge(tipo ** variabile, altro * test)
{
  realloc(*variabile,(sizeof(*variabile)+1)*sizeof(tipo*));
  memcpy(&(*variabile)->elemento,&test,sizeof(altro*));
}
Vado a memoria. Era qualcosa di simile.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 17:49   #11
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
credimi, l'avevo capito, ma a fatica
e non parlo del concetto, parlo dell'italiano
ri è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 18:04   #12
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da ri
credimi, l'avevo capito, ma a fatica
e non parlo del concetto, parlo dell'italiano
L'italiano era chiarissimo.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 18:09   #13
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
può essere
ma era quantomeno confusa
ri è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 18:15   #14
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
fek è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 18:19   #15
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
che volevi, che ti dicessi "oh sissis è vero mi son sbagliato scusascusascusa!" solo perchè hai postato?
ri è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 18:49   #16
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da ri
che volevi, che ti dicessi "oh sissis è vero mi son sbagliato scusascusascusa!" solo perchè hai postato?
No, volevo che ci dessi un taglio e lo voglio tutt'ora.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 19:03   #17
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
prima tu

mavalavà
ri è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 19:12   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Basta...mettiamoci un bel . e continuicamo a trattare l'argomento...che era interessante...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 19:54   #19
CoreDump
Senior Member
 
L'Avatar di CoreDump
 
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
Quote:
Originariamente inviato da fek
Mi piace questo punto. Perche' non usare la liberta' e la flessibilita' solo dove serve? Si unisce il buono dei due mondi: C/C++ dove serve la flessibilita', Java/C#/Python/Ruby dove la flessibilita' non ti serve, ma vuoi produttivita' e tranquillita'.

Sto entrando nell'ottica che non e' strettamente necessario usare un solo linguaggio per tutto il progetto, ma lo strumento giusto al momento giusto. Poi serve la colla per unire i vari linguaggi.
Per colla cosa intenti? una cosa tipo CORBA o piu semplicemente una interazione
se cosi si puo dire tra le diverse componenti di un progetto, tipo che per un
gioco che so un rpg 2d, mi faccio 'interfaccia per la gestione opzioni in
visual basic, il motore in c++ e magari un gestore di aggiornamenti in java
Io sono del parere che uno deve usare il linguaggio che meglio si adatta al
progetto, tipo un gestionale in visual basic, un motore grafico in c++ etc.etc.
anche perchè resta il fatto che bisogna poi conoscere tutti i linguaggi e bene
non è che puoi improvvisare
__________________
Puffo Programmatore su Puffolandia Groups
Il Software è come il Sesso, è meglio quando è Libero
CoreDump è offline   Rispondi citando il messaggio o parte di esso
Old 10-06-2005, 20:30   #20
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da CoreDump
Per colla cosa intenti? una cosa tipo CORBA o piu semplicemente una interazione
se cosi si puo dire tra le diverse componenti di un progetto, tipo che per un
gioco che so un rpg 2d, mi faccio 'interfaccia per la gestione opzioni in
visual basic, il motore in c++ e magari un gestore di aggiornamenti in java
Io sono del parere che uno deve usare il linguaggio che meglio si adatta al
progetto, tipo un gestionale in visual basic, un motore grafico in c++ etc.etc.
anche perchè resta il fatto che bisogna poi conoscere tutti i linguaggi e bene
non è che puoi improvvisare
Una prima soluzione puo' essere scrivere diversi tool di un progetto in linguaggi diversi come hai detto tu.

Una soluzione ancora piu' radicale in ambito PC e' COM, ma ancora meglio il suo successore .NET. Lo scopo di .NET e' esattamente il poter scrivere ogni oggetto nel linguaggio che meglio gli si adatta, dove ogni oggetto e' naturalmente esposto ad ogni altro linguaggio nell'ambiente CLR.

In un progetto al quale sto lavorando a tempo perso, ad esempio, stiamo scrivendo alcune parti che si interfacciano alle DirectShow in C++ nativo, che espone alcuni oggetti a piu' alto livello ad uno o piu' clienti scritti in C#, che comunicano con una infrastruttura di rete sempre scritta in C#, ma alcune parti multithreading dell'infrastruttra sono scritte in un linguaggio chiamato Cw (Comega) adattissimo a descrivere oggetti concorrenti. Il piano prevede di scrivere alcuni test automatici in linguaggi ad alto livello come Python/Ruby.

L'idea di base e' di usare il linguaggio piu' adatto a descrivere un oggetto e a risolvere un problema.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Google Maps avrà una modalit&agra...
HONOR sta lavorando a uno smartphone con...
Thermaltake MAGFloe 360 Ultra ARGB Sync:...
Xiaomi 15T ora in super offerta su Amazo...
Si stringe il cerchio attorno a TP-Link ...
Amazon cambia i prezzi ancora una volta:...
Imperdibili i Google Pixel 10 a questi p...
Dyson OnTrac in super offerta su Amazon:...
Amazon: la nuova ondata di licenziamenti...
Questo portatile è un mostro: MSI...
Apple Watch Series 11 GPS + Cellular cro...
JBL Clip 5 in forte sconto su Amazon: lo...
Il nuovo top di gamma compatto di OnePlu...
Cresce il divario tra dispositivi elettr...
La missione con equipaggio Shenzhou-21 h...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:21.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v