Я использовал CF Remote Performance Monitor, однако он, похоже, отслеживает только память, инициализированную в управляемом мире, в отличие от неуправляемого мира. Я могу только предполагать это, так как цифры, указанные в профилировщике, намного меньше максимально допустимых (32мб на CE 5). Профилирование конкретного приложения с помощью RPM показало мне, что общее использование всех кэшей достигает примерно 12мб, а затем медленно уменьшается, поскольку (я предполагаю) что-то неуправляемое начинает требовать больше памяти. Ползунок памяти в System также показывает, что устройству очень не хватает памяти. Если я убью процесс, ползунок показывает, что вся память возвращается. Значит, это должен быть (?) управляемый процесс, который поглощает память.
Есть ли какая-нибудь простая(ие?) мода, как можно отследить использование неуправляемой памяти таким образом, чтобы я мог сопоставить ее с соответствующими вызовами P/Invoke?
EDIT: Для всех вас, кто повторно ставит метку "это 'не .NET", такая пометка вопроса сбивает с толку. Это .NETCF / Compact Framework. Я знаю, что они кажутся похожими, но они отличаются, потому что .NET - это камни, а CF - это просто обертка вокруг NotImplementedException.
Попробуйте включить Interop logging.
Также, если у вас есть доступ к коду родной dll, которую вы используете, проверьте это: http://msdn.microsoft.com/en-us/netframework/bb630228.aspx.
Я'определенно боролся с неуправляемыми проблемами в управляемом приложении на C# некоторое время - это'нелегко.
Что я нашел наиболее полезным, так это регулярный вывод в текстовый лог-файл. Например, вы можете выводить GlobalMemoryStatus каждые пару минут, а также вести журнал каждый раз, когда вы загружаете новую форму. Отсюда вы, по крайней мере, сможете увидеть, что либо память постепенно уменьшается, либо огромные куски памяти исчезают в определенное время дня.
В нашем случае мы обнаружили постепенную потерю памяти в течение всего дня, пока использовалось устройство. В итоге мы обнаружили, что устройство для сканирования штрих-кодов инициализируется без особой причины в нашем базовом классе Form (я виню предыдущего разработчика! :-)).
Установка такого протоколирования может быть небольшой проблемой, но для нас это принесло огромные дивиденды в долгосрочной перспективе, особенно когда устройство используется в реальном времени, мы можем получить реальные данные, инструментарий, трассировку стека исключений и т.д.
Ок, я использую C++ на CE, а не C#, так что это может быть бесполезно, но...
Я использую пакет под названием Entrk toolbox, который отслеживает использование памяти и ресурсов, утечки и исключения под Windows CE. Довольно похоже на облегченную версию boundschecker для CE. В большинстве случаев помогает.