usar leaks how como c++ valgrind memory-corruption

c++ - leaks - valgrind ubuntu



Valgrind da un error para casi todo(Advertencia: ¿pilas de cambio de cliente?) (3)

¡Creo que me volé la primera pila!

Desde here

Seguido de muchos mensajes de error como "Lectura / escritura no válida" que contiene una nota: "La dirección está en la pila del hilo 1", entonces la causa es muy simple. Simplemente está asignando variables demasiado grandes en la pila; en mi caso, tenía una matriz demasiado grande, como variable local, en una de las funciones.

Reducir los tamaños solucionó el problema.

Estoy corrompiendo la memoria de alguna manera porque mi programa falla sin errores en lugares aleatorios.

Estoy usando valgrind con --leak-check=full , compilando con -O0 -g , y el primer problema que detecta es la primera línea en 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

Sigue 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

que apunta a

ifstream config_file("file");

Casi todas las líneas tienen un error.

¿Qué causa esto?


En Linux, estaba validando un programa y estaba muy seguro de que no estaba sobrepasando su pila. ¿Para suprimir las client switching stacks? del client switching stacks? error que se muestra aquí, utilicé:

ulimit -s unlimited

... Ahora valgrind corre como se desea!


Para señalar lo obvio, también podría hacer lo que sugiere valgrind, y eso es cambiar el marco de apilamiento máximo utilizando --max-stackframe=4728552 . Resolvió su problema directamente, pero esto también suprimiría los errores de "Lectura no válida".