Sto creando una libreria che ha troppo codice per darla qui.Come cercare un errore "all'indirizzo non valido indicato nella riga successiva"
Il mio problema è un errore di segmentazione, che Valgrind analizzare come:
Vai a l'indirizzo non valido dichiarato nella riga successiva
a 0x72612F656D6F682F: ???
a [...] (chiamata stack)
Grazie a this question, credo che è perché ho una pila di corruzione da qualche parte.
La mia domanda è: come trovarlo?
Ho provato a utilizzare GDB, ma l'errore di segmentazione sembra non essere nella stessa posizione. GDB mi dice che si trova sulla prima riga di una funzione mentre Valgrind dice che è la chiamata di questa funzione che fa difetto di segmentazione.
La risoluzione dei problemi relativi a UB non è affatto divertente e l'ordinamento di corruzione heap/stack può essere davvero doloroso. Non conosco un metodo metodico perfetto per farlo - solo un processo di restrizione dei sospetti (ad esempio: omettere temporaneamente sezioni di codice da elaborare, eliminare i sospetti come un investigatore). Quello che ho trovato nel corso degli anni è che ottengo sempre meno di questi - sono più facili da prevenire che scoprire a posteriori. Asserire le assunzioni liberamente, e specialmente intorno al codice pericoloso, può essere utile. Fare test rigorosi ogni volta che coinvolgi costrutti di basso livello può essere un risparmiatore di vita. –
Il rigore della procedura di test dovrebbe in genere ridimensionarsi con la quantità di codice di basso livello che stai scrivendo, ad esempio se stai scrivendo un contenitore di basso livello o un allocatore di memoria, che richiede un sacco di test delle unità. Ad ogni modo - temo che non sia così utile per il problema immediato - forse qualcuno ha un ottimo modo per eseguire il debug di questi. –
@Ike Right, era un contenitore sperimentale che stava scavalcando i dati sul mio stack ... Grazie per il consiglio. – Aracthor