Une impasse avec crochetage appelle à HeapAlloc pour une application de suivi de la mémoire

StackOverflow https://stackoverflow.com/questions/846807

Question

Je suis en train d'écrire une application de suivi de mémoire qui accroche tous les appels à l'aide HeapAlloc mécanisme de correction IAT. L'idée est de capturer tous les appels à HeapAlloc et obtenir un callstack.

Cependant, je suis actuellement confronté à un problème à obtenir l'aide de callstack DBGHELP Apis. Je trouve que la dll dbghelp lui-même est un lien vers MSVCRT dll et ce résultat dans un de dépendance appel récursif. Lorsque je tente d'obtenir un callstack pour l'un des appels de l'application cible, dbghelp appelle en interne une méthode de MSVCRT qui appelle à nouveau HeapAlloc. Et comme je l'ai déjà patché MSVCRT il en résulte une boucle infinie.

Quelqu'un at-il fait face à ce problème et résolu? Y at-il moyen de sortir de cette impasse?

Était-ce utile?

La solution

Ceci est un problème standard dans le code d'interception de fonction. Nous avons eu un problème similaire avec une bibliothèque de journalisation qui utilise la mémoire partagée pour stocker des informations de niveau de journal, tandis que la bibliothèque de mémoire partagée a dû enregistrer des informations.

La façon dont nous avons fixé il pourrait être appliqué à votre situation, je crois.

Dans votre code d'interception, de maintenir un drapeau statique qui indique que vous êtes ou non au milieu d'une interception. Lorsque votre interception est appelée et le drapeau n'est pas réglé, le drapeau alors faites ce que vous faites actuellement, y compris l'appel DbgHelp, puis désactivez le drapeau.

Si votre interception est appelée alors que le drapeau est réglé, appelez uniquement le code HeapAlloc back-end sans faire les autres choses (y compris l'appel DbgHelp qui est ce qui cause votre récursion infinie).

Quelque chose le long des lignes de (pseudo-code):

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

Autres conseils

Qu'en est-il en utilisant certains réel suivi des produits mémoire comme GlowCode ?

Vous pouvez utiliser Deviare Hook API et d'obtenir pleine stack- tracer sans utiliser cette API qui a un grand nombre de problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top