устранение утечек между двумя точками с помощью valgrind

#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 должен сообщить мне, какие объекты выделены и куда ушла память.