Come eseguire il debug di un programma dopo che sembra ripararsi [chiuso]

-1

Mentre inseguivo un segfault attorno a un complicato e scontroso programma c ++ ho aggiunto diverse dichiarazioni //comments e cout , ma nessun codice 'effettivo'. Poi, all'improvviso, per nessuna ragione apparente il segfault svanisce.

Sono felice, ma ancora un po 'preoccupato, perché non penso di aver aggiustato nulla e c'era chiaramente qualcosa di sbagliato.

Come posso eseguire il debug di un problema che è scomparso? (purtroppo non ho una versione che dia ancora un segfault, le versioni precedenti hanno altri problemi)

Per inciso, pensi che mi sbagli nel pensare di aver aggiunto solo //comments e cout affermazioni? È più probabile che abbia alterato accidentalmente qualcos'altro?

    
posta Jekowl 07.07.2015 - 12:46
fonte

2 risposte

6

Ottenere un errore di segmentazione si verifica solo quando hai richiamato comportamento indefinito . E un comportamento indefinito significa che le normali regole di un linguaggio di programmazione non si applicano: qualunque sia il sistema run-time fa è per definizione OK, e non si può lamentarsi di ciò. potrebbe fare anche la cosa prevista, solo per confonderti.

In particolare, l'aggiunta di istruzioni di debug può modificare un programma in modo che sollevi eccezioni dove non lo era prima, o viceversa. In effetti, questo è previsto, perché il rilevamento delle violazioni di accesso alla memoria dipende da come sono disposte esattamente le cose in memoria, e qualsiasi codice che aggiungi cambia questi dettagli.

Quindi, il tuo programma era decisamente sbagliato prima, e se non si ottengono eccezioni ora, è quasi certamente ancora sbagliato, solo meno ovviamente sbagliato. È molto più probabile che l'introduzione dei messaggi di debug abbia cambiato la varietà del comportamento non definito che hai risolto la tua logica e non l'hai notato.

    
risposta data 07.07.2015 - 12:50
fonte
2

I Segfault sono spesso influenzati da qualunque cosa si sia verificata nella memoria in cui stai tentando di accedere erroneamente. Aggiungere un cout vicino al bug può cambiarlo. Ho anche avuto bug che dipendono da quale posizione di memoria è stato assegnato un puntatore. Sposta il puntatore aggiungendo il codice "irrilevante" e cambia il comportamento.

Ecco perché il modo più sicuro per eseguire il debug di questi problemi è utilizzare un debugger, perché non modifica le condizioni. Capita anche di essere il modo più veloce, di solito ti dà istantaneamente la linea esatta in cui si verifica il bug e lo stato esatto delle variabili in quel punto, anche se la causa principale è spesso un incarico che si è verificato in precedenza. E non hai il sovraccarico di aspettare la compilazione. Non c'è davvero nessuna scusa per non imparare a usare un debugger.

    
risposta data 07.07.2015 - 15:09
fonte

Leggi altre domande sui tag