Использование Valgrind и низкоуровневых API C ++, которые являются гигантскими - PullRequest
3 голосов
/ 17 января 2012

Я нашел вопрос " Кто-нибудь использует Valgrind и Qt? ", и хотя это, казалось, проясняет некоторые вещи, я обнаружил, что информация, которую он содержит, все еще может быть дополнительным вопросом. Что я хотел бы знать, так это почему - когда я отлаживаю свое приложение (в частности, с Qt) - я не вижу ссылки на созданные мной функции? Вместо этого я нахожу тонны и тонны информации из более низких API (таких как Qt), которые, похоже, имеют много утечек памяти. Означает ли это, что в моем приложении нет утечек памяти или это так много информации о утечках памяти, что сначала оно предназначается для API более низкого уровня, а затем решает перейти к коду более высокого уровня?

Я запустил свой исполняемый файл valgrind со следующими флагами:

valgrind  --leak-check=full  --show-reachable=yes -v ./HelloGL 

Кроме того, что, черт возьми, с этим происходит?

ERROR SUMMARY: 925 errors from 899 contexts (suppressed: 29 from 7)

Pastebin .

1 Ответ

4 голосов
/ 17 января 2012

Я думаю, что ваша проблема в том, что дерево вызовов очень глубокое. Вы можете отрегулировать глубину, сообщаемую с помощью:

--num-callers=<number> [по умолчанию: 12]

Задает максимальное количество записей, отображаемых в трассировках стека, которые определяют местоположения программы. Обратите внимание, что ошибки распределяются с использованием только четырех верхних местоположений функций (места в текущей функции и места ее трех непосредственных абонентов). Так что это не влияет на общее количество зарегистрированных ошибок.

Максимальное значение для этого - 50. Обратите внимание, что более высокие настройки заставят Valgrind работать немного медленнее и занять немного больше памяти, но могут быть полезны при работе с программами с глубоко вложенными цепочками вызовов.

Трудно ответить, являются ли проблемы внутренними для Qt или вызваны вашим использованием Qt. Однако, когда трассировки вызовов не доходят до вашего кода, становится очень трудно определить, где на самом деле проблема. В целом, вы должны предположить, что скорее всего ваш код, чем Qt, виноват.

Относительно сводки ошибок: valgrind Всего обнаружено 954 ошибки. Однако 29 из них были из функций, которые, как известно, вызывают проблемы, поэтому сообщения об ошибках были подавлены. Фактически, эти 29 проблем возникли в семи местах (функциях, контекстах), которые, как известно, вызывают проблемы. Другие ошибки 925 не были подавлены, то есть они либо произошли из вашего кода, либо были недавно обнаружены, но никогда не обнаруживались до ошибок в системном коде. Было 899 отдельных контекстов для этих ошибок (поэтому было много разных мест, вызывающих проблемы, с очень небольшим количеством повторений). Контекст - это фрагмент записанной цепочки вызовов (функций, совершающих определенную ошибку). Итак, было выявлено много проблем. Вам просто нужно увидеть, какие из ваших функций вызвали эти проблемы.

...