Как я могу сказать, что у моего управляемого кода утечка памяти из-за собственных вызовов библиотеки?
-
05-07-2019 - |
Вопрос
У меня есть управляемый dll, который вызывает в нативную библиотеку. Эта нативная библиотека обычно возвращает IntPtrs. Они могут быть переданы другим методам в нативной библиотеке для выполнения каких-либо действий или для указания библиотеке освободить экземпляр, связанный с IntPtr. Но только некоторые экземпляры должны быть освобождены таким образом, другие управляются библиотекой. Проблема в том, что в документации не всегда ясно, какие экземпляры должны быть освобождены, а какие нет.
Я хочу знать, есть ли способ узнать, сохранил ли мой код ссылки на какие-либо указатели, которые должны быть освобождены, и вызывает ли утечка памяти?
Решение
Самый простой способ - использовать профилировщик памяти. Быстрый Google нашел ссылку на MemProfiler . Я использовал это однажды (в качестве пробной версии), и я смог найти места, где я не мог правильно избавиться от DirectoryEntries. Я уверен, что есть и другие, включая один от RedGate. р>
Другие советы
Я использую WinDbg (его можно найти здесь ). Его командная строка управляется, но предоставляет множество хороших отчетов, включая информацию о стеке, количестве объектов и взятом размере (это может помочь указать на элементы, которые не удаляются).
Существует также инструмент диагностики отладки, который имеет специальные отчеты для утечек памяти и обработки. Его здесь р>
Вы можете рассмотреть возможность использования SafeHandles обернуть дескрипторы, возвращенные из родного кода. Это обеспечивает некоторую дополнительную ценность по сравнению с IntPtr.