Тупик с перехватом вызовов для HeapAlloc для приложения отслеживания памяти - PullRequest
1 голос
/ 11 мая 2009

Я пишу приложение для отслеживания памяти, которое перехватывает все вызовы HeapAlloc с помощью механизма исправления IAT. Идея состоит в том, чтобы перехватить все вызовы HeapAlloc и получить стек вызовов.

Однако в настоящее время я сталкиваюсь с проблемой получения стека вызовов с использованием DBGHELP Apis. Я обнаружил, что сама dbghelp dll связана с dll MSVCRT, и эта зависимость приводит к рекурсивному вызову. Когда я пытаюсь получить стек вызовов для любого из вызовов целевого приложения, dbghelp внутренне вызывает некоторый метод из MSVCRT, который снова вызывает HeapAlloc. И так как я уже исправил MSVCRT, это приводит к бесконечному циклу.

Кто-нибудь сталкивался с этой проблемой и решил ее? Есть ли выход из этого тупика?

Ответы [ 3 ]

3 голосов
/ 11 мая 2009

Это стандартная проблема в коде перехвата функции. У нас была похожая проблема с библиотекой журналов, которая использовала разделяемую память для хранения информации уровня журнала, в то время как библиотека разделяемой памяти должна была регистрировать информацию.

Думаю, способ, которым мы это исправили, может быть применен к вашей ситуации.

В вашем коде перехвата поддерживайте статический флаг, который указывает, находится ли вы в середине перехвата. Когда ваш перехват вызывается, а флаг не установлен, установите флаг, затем сделайте то, что вы в настоящее время делаете, включая вызов DbgHelp, затем снимите флаг.

Если ваш перехват вызывается при установленном флаге, вызывайте только внутренний код HeapAlloc без выполнения каких-либо других действий (включая вызов DbgHelp, который вызывает вашу бесконечную рекурсию).

Нечто подобное (псевдокод):

function MyHookCode:
    static flag inInterceptMode = false
    if inInterceptMode:
        call HeapAlloc
        return
    inInterceptMode = true
    call DbgHelp stuff
    call HeapAlloc
    inInterceptMode = false
    return

function main:
    hook HeapAlloc with MyHookCode
    : : :
    return
0 голосов
/ 15 ноября 2010

Вы можете использовать Deviare API Hook и получить полную трассировку стека без использования этого API, который имеет большое количество проблем.

0 голосов
/ 11 мая 2009

Как насчет использования некоторых реальных продуктов отслеживания памяти, таких как GlowCode ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...