Как лучше всего найти ВСЮ память при разработке на Compact Framework?
-
08-06-2019 - |
Вопрос
Я использовал CF Удаленный монитор производительности, однако, похоже, это отслеживает только память, инициализированную в управляемом мире, а не в неуправляемом мире.Ну, я могу только предполагать это, поскольку числа, указанные в профилировщике, намного меньше максимально допустимого (32 МБ на CE 5).Профилирование конкретного приложения с помощью RPM показало мне, что общий объем использования всех кешей достигает примерно 12 МБ, а затем медленно сокращается, поскольку (я предполагаю) что-то неуправляемое начинает требовать больше памяти.Ползунок памяти в системе также показывает, что устройству очень не хватает памяти.Если я остановлю процесс, ползунок покажет, что вся память возвращается.Значит, это (?) этот управляемый процесс поглощает память.
Есть ли какой-нибудь простой (почти?) способ каким-либо образом отслеживать использование неуправляемой памяти, который мог бы позволить мне сопоставить его с соответствующими вызовами P/Invoke?
РЕДАКТИРОВАТЬ:Для всех, кто меняет теги, это не .NET., такая пометка вопроса сбивает с толку.Это .NETCF/Compact Framework.Я знаю, что они кажутся похожими, но они разные, потому что .NET великолепен, тогда как CF — это, по сути, просто оболочка NotImplementedException.
Решение
Попробуйте включить Журнал взаимодействия.
Кроме того, если у вас есть доступ к коду используемой вами собственной библиотеки DLL, проверьте это: http://msdn.microsoft.com/en-us/netframework/bb630228.aspx
Другие советы
Я определенно некоторое время боролся с неуправляемыми проблемами в управляемых приложениях C# — это непросто.
Что я считаю наиболее полезным, так это регулярный вывод в текстовый файл журнала.Например, вы можете распечатать вывод ГлобалМемориСтатус каждые пару минут вместе с регистрацией каждый раз, когда вы загружаете новую форму.Отсюда вы можете, по крайней мере, увидеть, что либо память постепенно разрушается, либо в определенное время дня исчезают огромные куски памяти.
Мы обнаружили постепенную потерю памяти в течение всего дня, пока устройство использовалось.В конце концов мы обнаружили, что устройство сканирования штрих-кода инициализировалось без особой причины в нашем базовом классе Form (я виню в этом предыдущего разработчика!:-)
Настройка такого ведения журнала может оказаться небольшой проблемой, но в долгосрочной перспективе для нас это принесло огромные дивиденды, особенно когда устройство используется в реальном времени, мы можем получать реальные данные, инструменты, трассировку стека из исключений и т. д.
Хорошо, я использую C++ для CE, а не C#, так что это может быть бесполезно, но...
Я использую пакет под названием Набор инструментов для входа который отслеживает использование памяти и ресурсов, утечки и исключения в Windows CE.Очень похоже на облегченную версию Boundschecker для CE.Делает трюк в большинстве случаев.