2014-09-17 7 views
-1

Как лучше всего определить память, которая не была правильно выпущена во время выполнения? Я знаю несколько программ, которые идентифицируют выделенную и не освобожденную (пропущенную) память, когда приложение закрывается. Но моя проблема заключается в том, что во время выполнения программы (возможно, поток) создаются некоторые объекты, которые не освобождаются, хотя они должны быть после того, как система будет выполнена с «работой».Идентифицировать незапущенную память во время выполнения

Сохранение системы, которая работает с течением времени. Но когда программа выключается, память, похоже, правильно освобождается и, таким образом, никогда не сообщается как утечка в MadExcept, которую я использую в данный момент.

Как лучше всего определить, что выделяет эту память каждый раз, когда выполняется «работа», а не освобождая ее до завершения программы? Это довольно большая серверная система с примерно 1 млн строк кода, несколько подпроектов DLL и несколько потоков (40-50).

Возможно, есть система, которая могла бы идентифицировать выделенные объекты, которые были живы дольше, чем X мин. Предположим, что выбрано 60 минут, и система оставила работу. Затем эту информацию можно было бы использовать для поиска многих из этих длинных живых объектов и их исследования?

+0

Возможно, вы можете использовать [Boehm's GC] (http://www.hboehm.info/gc/), по крайней мере, в своем режиме детектора утечки. –

+1

Я не думаю, что есть вспомогательная программа, которая учитывает то, что должен был рассмотреть программист. Пока память доступна, ничто не может сделать вывод о том, что объект должен быть удален. – 101010

+0

40two: Я понимаю, что это проблематично. Если бы я построил это с нуля, я бы, вероятно, лучше понял, что может вызвать его. Я думал, что, возможно, есть программа, где вы можете фильтровать и получать как список всех объектов, которые были живы более 60 минут, например. Если вы видите грузы того же типа с длительным сроком службы, вы можете это исследовать. – inquam

ответ

0

В конце концов я попробовал оценочную версию Softwareverify'sC++ Memory Validator.

Он работал точно так же, как я хотел, и смог предоставить временную линию распределения памяти и т. Д., Чтобы я мог определить, что накапливалось с течением времени и как долго оно было живым. Используя это, я смог идентифицировать проблему и исправить ее.

0

Если вы используете C++ и визуальную студию, я думаю, что это полезно link. Вы можете _CrtMemCheckpoint и CrtMemDumpStatistics, когда вам нужно.

+0

«К сожалению» проект написан в Embarcadero RAD Studio 2010 (с использованием C++ builder), и это немного ограничивает. Я желаю много раз использовать VS, но, к сожалению, не :) – inquam

Смежные вопросы