|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
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; Codice:
, mSign(MODEL_ENGINE_SIGN) Codice:
bool ModelInstance::Test(void) const
{
if (MODEL_ENGINE_SIGN != mSign)
{
return false;
}
if (!CheckMatrixSanity(*mModelMatrix))
{
return false;
}
return true;
}
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.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#2 |
|
Senior Member
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 |
|
|
|
|
|
#3 |
|
Senior Member
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
|
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
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 Lezione del giorno: usare la compilazione condizionale all'interno della definizione di una classe in un header file non e' una buona idea. Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#5 |
|
Senior Member
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! |
|
|
|
|
|
#6 |
|
Senior Member
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!
__________________
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
|
Bello sto 3d Fek
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 |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
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.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
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*));
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#11 |
|
Senior Member
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 |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
può essere
ma era quantomeno confusa |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#15 |
|
Senior Member
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?
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
|
prima tu
![]() mavalavà |
|
|
|
|
|
#18 |
|
Senior Member
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...
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Mar 2003
Città: Roma
Messaggi: 1654
|
Quote:
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 |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
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.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:21.




















