Valgrind gives an error for nearly everything (Warning: client switching stacks?)

房东的猫 提交于 2019-12-22 01:27:02

问题


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?


回答1:


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.




回答2:


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.




回答3:


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!