Salve,
sto sviluppando un programma in c++, ma da ieri mi sono bloccato alla ricerca di un errore che non riesco a scovare. Il programma ha uno stream di output su un file all'interno del quale vengono appesi dei risultati ottenuti durante la computazione. Fino a ieri tutto andava bene, poi sono iniziati i problemi; è altamente probabile che si tratti di un errore di memoria:
- Come si manifesta l'errore:
Lancio il programma, quando è terminato, apro il file in cui vengono scritti i risultati e si vede che la parte iniziale dei dati è stata cancellata e sostituita da quadratini vuoti (sotto linux), sotto windows appaiono come quadrati pieni se apro il file con textpad o come spazi bianchi se lo apro con blocco note.
- Quando si manifesta l'errore:
Si manifesta in modo molto strano. Supponiamo che il programma mi funzioni. Prendo una funzione di una classe, in cui c'è un costrutto switch, aggiungo un ramo case fittizio in cui non faccio nulla:
case(50){
break;
}
durante l'esecuzione il valore 50 nn è mai quello passato nello switch. Questo basta per corrompere il file.
Oppure, in un altra funzione dichiaro delle variabili stringa:
std::string a1("aaaaaaaa");
std::string a2("aaaaaaaa");
std::string a3("aaaaaaaa");
std::string a4("aaaaaaaa");
std::string a5("aaaaaaaa");
variabili che non sono utilizzate in alcun modo, ne ci sono altre variabili o campi con lo stesso nome da qualke altra parte; questo basta a corrompere il file.
Oppure in un altra funzione di un altra classe dichiaro un ofstream:
std:fstream t1("a.a");
tutto ok
se ne dichiaro 2
std:fstream t1("a.a");
std:fstream t1("b.b");
file corrotto, anche se i files a.a e b.b non vengono in alcun modo coinvolti nel programma, sono semplicemente delle dichiarazioni che restano inutilizzate.
E altri esempi simili; insomma sembra che basti aggiungere istruzioni apparentemente innocue, e che al limite neanche vengono eseguite, come il ramo case fittizio, che si presenta il problema.
Ora, quello che vorrei sapere da voi è se sapete suggerirmi dei procedimenti o strumenti per effettuare il debug, visto che non ho mai usato strumenti appositi per il debug, e non so come procedere. Purtroppo non posso postare il codice perke è costituito da molte classi e fa uso anche di una libreria installata sul mio sistema. Il tutto avviene sotto linux. Mi piacerebbe avere suggerimenti per sapere come monitorare il file che viene corrotto, perke quando c'è un bug su una variabile si puo risolvere semplicemente, stampando qua e la la variabile per vederne il valore, qui non so come fare per vedere quand'è che subentra l'errore nello stream e soprattutto qual è l'errore che va a sovrascrivere qualke dato in memoria provocando l'errore, perkè è ovvio che gli esempi che ho descritto sopra non sono la causa dell'errore, ma sono solo esempio che rendono visibile l'errore.
Ogni suggeriemnto è benacceto, grazie e ciao.