Автор: Максим Коллегин Иван, добрый день, спасибо за ваше сообщение.
1. Исключать процессы можно через ветку реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProExclude, Название подключа любое. FileName - название исполняемого файла процесса.
2. Мы постараемся решить проблему, но нам очень бы помогла простая пошаговая инструкция или тестовый проект, который поможет локализовать несовместимость.
Добрый день!
Я работаю в команде профиляторов в компании JetBrains.
Я провела исследование взаимодействия последних версий CryptoPro c профилятором памяти dotMemory и выявила проблему в случае когда dotMemory собирает данные об аллокациях через profiling API. Внутри нашего профайлера происходит следующее:
1. Профайлер это Windows COM объект, который реализует интерфейс:
https://docs.microsoft.c...ofilercallback-interface2. После того как COM объект создан, происходит вызов:
https://docs.microsoft.c...llback-initialize-method3. В методе есть аргумент IUnknown, для которого делается cast в ICoreProfilerInfo и записывается в переменную, в нем для ICoreProfilerInfo вызывается
https://docs.microsoft.c...info-seteventmask-method с флагами COR_PRF_MONITOR_OBJECT_ALLOCATED | COR_PRF_ENABLE_OBJECT_ALLOCATED
На этом метод инициализации профайлера завершается.
4. После этого в профайлер должны начать приходить коллбэки
https://docs.microsoft.c...k-objectallocated-methodВ каждом коллбэке приходит параметр ObjectId и для каждого из них вызывается
https://docs.microsoft.c...nfo-getobjectsize-method - на этом моменте происходит ошибка.
Как это воспроизвести в dotMemory:
- Установить
КриптоПро CSP 5.0 (CSPSetup-5.0.12266)
- Установить
КриптоПро .NET (NETSetup 1.0.7775.0 от 20.04.2021)
- Запуситить dotMemory UI версию. Я проверяла на последнем
EAP, но разницы с
релизом не должно быть.
- Создать "Standalone" конфигурацию в "New process run", выбрать .exe для профиляции. Тут есть некоторые нюансы, так как не на всех приложениях проблема воспроизводится, нужно более-менее сложное приложение, которое создает много разных объектов в памяти. У меня воспроизвелось на процессе Visual Studio (devenv.exe) и на процессе самого dotMemory, наш .exe можно найти в папке инсталляции, по умолчанию "%localappdata%\JetBrains\Installations\dotMemory<vN>\dotMemory.UI.64.exe". Можно попробовать и на других приложениях, я указала те с которыми я получила 100% вопроизведение.
- Включить полный режим сбора аллокаций: установить Collect allocation data -> Full если используется dotMemory 2021.3 и позднее, либо включить флаг "Collect memory allocation and traffic data from start" для dotMemory 2021.2 и ранее (в 2021.3 немного поменяли UI). Этот режим как раз соответствует описанному выше сбору аллокаций через profiling API.
- Нажать "Start" => проблема возникает сразу и выглядит следующим образом: кнопка "Get snapshot" недоступна, в правом верхнем углу мигает желтый треугольник, при его нажатии отображается ошибка ядра нашего профайлера.
Воркэраунд который мне помог:
- Добавить ключ в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CProExclude с именем исполняемого файла в значении (devenv.exe в моем случае).
- Перезагрузить компьютер.
Ссылка на тикет от нашего пользователя:
https://youtrack.jetbrains.com/issue/DMRY-6637Ниже прикладываю скриншоты из интерфейса с настройкой конфигурации и самой ошибкой.
Core error.png
(77kb) загружен 5 раз(а). Enable alloc.png
(58kb) загружен 4 раз(а).