Обнаружение утечки памяти для проектов в смешанном режиме: управляемых, неуправляемых и собственных - PullRequest
7 голосов
/ 15 октября 2011

У меня есть решение Visual Studio 2010, которое содержит C # (управляемые), C ++ / CLI (неуправляемые) и чистые C ++ (собственные) проекты. Я хотел бы выполнить обнаружение утечки памяти во всех 3 проектах или, по крайней мере, вокруг собственного кода:

  • Проект C # ссылается на неуправляемую dll (у меня есть доступ к общедоступным инструментам профилирования памяти .NET, поэтому на самом деле не проблема запустить профилирование памяти на нем).
  • C ++ / CLI - это очень тонкая обертка вокруг собственной библиотеки C ++, поэтому мне не нужно ее профилировать (не особо об этом беспокоиться).
  • Наиболее сложный для профилирования нативный код на C ++.

Я пытался использовать Intel Inspector XE 2011, но он просто слишком медленный ... делает простую вещь, такую ​​как простая инициализация моей системы, и занимает так много времени, что я еще даже не видел ее завершенной. Когда я запускаю свою систему без IXE 2011, у меня уходит не более 10-15 секунд на инициализацию моей системы, в то время как с IXE мы позволяем ей работать часами и она не проходит инициализацию. Я пытался исключить некоторые библиотеки из профилирования, но это не имело никакого эффекта.

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

int* memoryLeak = new int;

Я снова побежал с VLD, но он выплевывал то же самое сообщение. Я рассматриваю возможность переопределения операторов new / delete или даже просто malloc / free, но я хотел убедиться, что я исчерпал все остальные опции, прежде чем углубляться в это.

Что я могу сделать, чтобы профилировать использование памяти моей родной библиотеки C ++ с Visual Studio 2010? Существуют ли другие инструменты или методы, которые могут работать (даже если они не интегрируются с VS2010)?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

В .NET, даже если вы используете управляемые объекты, может быть что-то, что никогда не будет утилизировано (посмотрите несколько примеров здесь: Утечка памяти в C # ).

О нативной части вымогут использовать два разных подхода:

1 голос
/ 11 ноября 2011

Выполните юнит-тесты, которые проверит юниты на утечки памяти: http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

Получить первое состояние памяти до выделения объекта и второе после его освобождения. Сравните ваши состояния памяти после.

Также вы можете попробовать использовать другие профилировщики, такие как valgrind, devpartner.

...