Подтвердить что ты не робот

Valgrind дает ошибку почти для всего (предупреждение: стек переключения клиента?)

Я как-то развращаю память, потому что моя программа вылетает без ошибок в случайных местах.

Я использую 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 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 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 stack

который указывает на

ifstream config_file("file");

Почти каждая строка имеет ошибку.

Что вызывает это?

4b9b3361

Ответ 1

Думаю, я взорвал свой первый стек!

От здесь

Далее следуют многие сообщения об ошибках типа "Недопустимое чтение/запись", содержащее примечание: "Адрес находится в потоке 1-го стека", тогда причина очень проста. Вы просто выделяете слишком большие переменные в стеке - в моем случае у меня был слишком большой массив, как локальная переменная, в одной из функций.

Уменьшение размеров устраняет проблему.

Ответ 2

Чтобы указать на очевидное, вы также можете сделать то, что предлагает valgrind, и это изменить максимальный фрейм стека с помощью --max-stackframe=4728552. Вы решили свою проблему напрямую, но это также подавило бы ошибки "Недопустимое чтение".

Ответ 3

В Linux я работал над программой, и был очень уверен, что она не перекрыла его стек. Чтобы подавить ошибку client switching stacks?, показанную здесь, я использовал:

ulimit -s unlimited

... Теперь valgrind запускается по желанию!