我以某种方式破坏了内存,因为我的程序在随机位置崩溃而没有错误。
我将valgrind与--leak-check=full
一起使用,使用-O0 -g
进行编译,它检测到的第一个问题是int main()
cout << "reading file" << endl;
带
==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
继续
==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
指向
ifstream config_file("file");
几乎每一行都有错误。
是什么导致这种情况?
答案 0 :(得分:19)
我想我吹了第一堆!
来自here
跟随许多错误消息,例如&#34;无效的读/写&#34;包含一个注释:&#34;地址在线程1的堆栈上#34;那么原因很简单。你只是在堆栈上分配太大的变量 - 在我的情况下,我在一个函数中有一个太大的数组,作为局部变量。
缩小尺寸可以解决问题。
答案 1 :(得分:5)
要指出显而易见的,你也可以做valgrind建议的,那就是使用--max-stackframe=4728552
更改最大堆栈帧。您直接解决了问题,但这也会抑制那些“无效读取”错误。
答案 2 :(得分:5)
在Linux上,我正在编写一个程序,并且非常确定它没有超出它的堆栈。为了抑制此处显示的client switching stacks?
错误,我使用了:
ulimit -s unlimited
...现在valgrind按照需要运行!