Существует метод, известный как Перехват API . Хорошо известная BugslayerUtil.DLL от Джона Роббинса (см. Его книгу «Отладка приложений») изначально использовалась как перехват API в собственном процессе. Я имею в виду, что все выделение памяти может быть выделено относительно небольшого количества хорошо известных функций, таких как LocalAlloc
, GlobalAlloc
, VirtualAlloc
и т. Д. Можно перезаписать начальные адреса этих функций внутри адресного пространства процесса. Вы можете сделать это либо где-нибудь в начале процесса, либо использовать DLL Injection, чтобы сделать это (как это делает Dependency Walker в режиме профилирования). Таким образом, вы сможете регистрировать (отслеживать) каждую попытку выделения памяти, переадресовывать вызов исходной функции, просматривать полученный журнал возвращаемых значений (отслеживать) еще раз и возвращать результаты. Внутри каждой попытки вызова вы можете видеть все функции, которые вызвали эту функцию в стеке вызовов. Таким образом, содержимое стека вызовов вместе с адресом выделенной памяти и размером дает вам полную информацию, которую вы ищете. Вы увидите все в динамике.
Вы не должны реализовывать все вещи самостоятельно. Просто поищите в Интернете «перехват API» или «внедрение DLL», и вы найдете достаточно рабочих примеров. Для проверки стека вызовов вы можете использовать документированную функцию StackWalk64 (см. http://msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx) из imagehlp.dll / dbghelp.dll (например, см. http://www.codeproject.com/KB/threads/StackWalker.aspx).
Так что мне кажется, что ваша проблема может быть решена.