I'm corrupting memory somehow because my program crashes without error at random places.
I'm using valgrind with --leak-check=full
, compiling with -O0 -g
, and the very first problem it detects is the first line in int main()
cout << "reading file" << endl;
with
==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
It goes on with
==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
which points to
ifstream config_file("file");
Nearly every line has an error.
What causes this?
I think I blew my first stack!
From here
Followed by many error messages like "Invalid read/write" containing a note: "Address is on thread 1's stack" then the cause is very simple. You are just allocating too large variables on stack - in my case I had too large array, as local variable, in one of functions.
Reducing sizes fixed the problem.
To point out the obvious, you could also do what valgrind suggests, and that is to change the maximum stack frame using --max-stackframe=4728552
. You solved your problem directly, but this would also suppress those "Invalid read" errors.
On Linux, I was valgrinding a program, and was very sure that it was not overrunning its stack. To suppress the client switching stacks?
error shown here, I used:
ulimit -s unlimited
...Now valgrind runs as desired!
来源:https://stackoverflow.com/questions/23307110/valgrind-gives-an-error-for-nearly-everything-warning-client-switching-stacks