2014-04-26 7 views
20

Sto corrompendo la memoria in qualche modo perché il mio programma si arresta in modo anomalo senza errori in luoghi casuali.Valgrind restituisce un errore per quasi tutto (Avviso: stack di commutazione client?)

Sto utilizzando valgrind con --leak-check=full, compilazione con -O0 -g, e il primo problema che rileva è la prima linea in int main()

cout << "reading file" << endl; 

con

==5089== Warning: client switching stacks? SP change: 0x7ff0004f8 --> 0x7feb7de10 
==5089==   to suppress, use: --max-stackframe=4728552 or greater 
==5089== Invalid write of size 8 
==5089== at 0x41E107: main (Dgn.cpp:2833) 
==5089== Address 0x7feb7de08 is on thread 1's stack 

Si prosegue con

==5089== Invalid read of size 8 
==5089== at 0x5DE6E10: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18) 
==5089== by 0x67AEDE4: (below main) (libc-start.c:260) 
==5089== Address 0x7feb7de08 is on thread 1's stack 
==5089== 
==5089== Invalid write of size 8 
==5089== at 0x5DBF8F2: std::ios_base::ios_base() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18) 
==5089== by 0x5E06BFF: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18) 
==5089== by 0x41E131: main (Dgn.cpp:2834) 
==5089== Address 0x7feb7e1e8 is on thread 1's stack 

che punta a

ifstream config_file("file"); 

Quasi ogni riga ha un errore.

Quali sono le cause?

+0

inserisci il tuo codice ... –

+0

@MattMcNabb Quale parte desideri pubblicare? C'è molto. Stavo dando a 'spsc_queue' tonnellate di capacità, come 16k, lol. Questo è quello che ho ridotto. Ora, il mio programma non si blocca. –

risposta

19

Penso di aver saltato il mio primo stack!

Da here

Seguito da molti messaggi di errore come "non valido di lettura/scrittura" che contiene una nota: "indirizzo è sulla pila filo 1 di" allora la causa è molto semplice. Stai solo assegnando allo stack variabili troppo grandi - nel mio caso ho avuto un array troppo grande, come variabile locale, in una delle funzioni.

La riduzione delle dimensioni ha risolto il problema.

+0

* "La riduzione delle dimensioni ha risolto il problema ..." * - riducendo le dimensioni? – jww

5

Per evidenziare l'ovvio, è possibile anche eseguire le operazioni suggerite da valgrind e modificare il frame di stack massimo utilizzando --max-stackframe=4728552. Hai risolto il tuo problema direttamente, ma questo sopprimerebbe anche quegli errori di "lettura non valida".

5

Su Linux, stavo valutando un programma, ed ero molto sicuro che non stava invadendo il suo stack. Per eliminare l'errore client switching stacks? mostrato qui, ho usato:

ulimit -s unlimited

... Ora valgrind funziona, se lo desideri!

+0

Perché questo aiuto? Non fa nulla per il messaggio di avviso per me. –

+0

L'errore Valgrind si verifica qui se Valgrind vede il puntatore dello stack uscire dall'area che dovrebbe * essere usato * per lo stack. Questo potrebbe essere per una serie di motivi, ma una ragione è semplicemente perché un programma utilizza molto spazio nello stack. 'ulimit -s' imposta la quantità di memoria predefinita allocata per lo stack di ogni processo. Non ho letto la sorgente di Valgrind, ma presumo che possa guardare il valore di 'ulimit' quando si determina quanto grande deve essere lo stack. –

+0

Nel mio caso, il programma * non * stava facendo esplodere lo stack, era solo usando più spazio di stack di quanto previsto da Valgrind. Se il tuo programma * sta * facendo esplodere il suo stack, o se qualcos'altro sta impostando il puntatore dello stack su un valore falso, allora questa risposta non ti aiuterà. Devi scoprire * perché * il valore del puntatore dello stack è insolito. –

Problemi correlati