Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352

    Errore in C++ - come lo scovo???

    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.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  2. #2
    Non sono un esperto, ma mi sembra un errore di tipo buffer overflow. Per il debug su windows dipende credo da che ambiente stai utilizzando, che dovrebbe avere il suo debugger.

    Su linux se non erro puoi usare o gdb da riga di comando oppure ddd (data display debugger). Ma potrebbe esserti utile anche il comando strace. Purtroppo sono comandi che non conosco affatto bene, ma se dai uno sguardo al man dei singoli comandi forse puoi trovare qualche risposta.

  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Date le condizioni in cui si manifesta l'errore è sicuramente un errore di accesso alla memoria, ma il fatto è che non ho idea di come eseguire il debug...poi nn capisco perche l'effetto sia sempre quello di alterare il contenuto del file, nel senso che quando si va a scrivere nel file appendendoci del caratteri, se scatta l'errore, si ha come effetto collaterlare quello di sostituire parte dei dati iniziali con dei quadratini.

    Per trovare l'overflow dovrei monitorare tutta la memoria del programma passo per passo, ma non è fattibile come cosa, ma come posso idivuduare altrimenti quali sono quelle locazioni di memoria che vengono accidentalemtne dannegiate da qualke istruzione?


    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.