Я как-то повреждаю память, потому что моя программа вылетает без ошибок в случайных местах.
Я использую 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");
Почти каждая строка имеет ошибку.
Что вызывает это?
Я думаю, что я взорвал свой первый стек!
От Вот
За этим следует множество сообщений об ошибках, таких как «Недопустимое чтение / запись», содержащих примечание: «Адрес находится в стеке потока 1», тогда причина очень проста. Вы просто размещаете слишком большие переменные в стеке — в моем случае у меня был слишком большой массив в качестве локальной переменной в одной из функций.
Уменьшение размеров решило проблему.
Чтобы указать на очевидное, вы также можете сделать то, что предлагает valgrind, то есть изменить максимальный кадр стека, используя --max-stackframe=4728552
, Вы решили свою проблему напрямую, но это также подавило бы эти ошибки «Недопустимое чтение».
В Linux я запускал программу и был уверен, что она не превысила свой стек. Подавить client switching stacks?
ошибка, показанная здесь, я использовал:
ulimit -s unlimited
…Теперь Valgrind работает как нужно!