#memory #memory-leaks #valgrind
#память #утечки памяти #valgrind
Вопрос:
я использую valgrind для поиска и отслеживания проблем с памятью. Теперь я хочу сделать что-то вроде этого:
before = getValgrindState();
do_something_curious();
after = getValgrindState();
difference = after - before;
std::cout << difference;
Возможно ли что-то подобное с valgrind?
Среда выполнения MS Visual C предоставляет следующие функции:
- _CrtMemCheckpoint (для сбора текущего состояния выделенной памяти)
- _CrtMemDifference (для вычисления разницы между двумя состояниями)
И я хотел бы знать, есть ли способ реализовать аналогичную функциональность с помощью valgrind.
Комментарии:
1. Моя цель — найти объекты, которые все еще присутствуют после выполнения функции do_something_curious().
Ответ №1:
Примитивный / деструктивный способ сделать то, что вы хотите, — это использовать _exit()
(обратите внимание на подчеркивание), чтобы избежать вызова любого из деструкторов.
- запустите valgrind / memcheck для вашего кода, который вызывается
_exit()
передdo_something_curious();
- снова запустите valgrind / memcheck с
_exit()
послеdo_something_curious();
- сравните результаты, чтобы увидеть, что
do_something_curious()
осталось.
[Я не мог понять, как massif будет делать то, что вы хотите (есть ли способ заставить massif отслеживать операции free
/ delete
и согласовывать с malloc
/ new
операциями, которые я пропустил?)]
Комментарии:
1. Спасибо за этот совет. Это требует немного больше ручной работы, но это должно дать мне правильный результат.
2. Аналогичный подход, использующий только одно выполнение, заключается в вызове VALGRIND_DO_LEAK_CHECK вместо _exit(). Смотрите valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs Вам все равно придется сравнивать два отчета самостоятельно.
Ответ №2:
Что вы хотите измерить? В чем должна заключаться «разница»? Если вы хотите проверить использование памяти, попробуйте использовать инструмент массив valgrind. Визуализатор массивов полезен для интерпретации результатов.
Комментарии:
1. объект difference должен сообщить мне, какие объекты выделены и куда ушла память.