首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将调用挂钩到HeapAlloc以用于内存跟踪应用程序的僵局

将调用挂钩到HeapAlloc以用于内存跟踪应用程序的僵局
EN

Stack Overflow用户
提问于 2009-05-11 05:26:47
回答 3查看 1.5K关注 0票数 1

我正在编写一个内存跟踪应用程序,它使用IAT补丁机制将所有调用挂接到HeapAlloc。这个想法是捕获所有对HeapAlloc的调用,并获得一个调用堆栈。

但是,我目前在使用DBGHELP Apis获取调用堆栈时遇到了一个问题。我发现dbghelp dll本身链接到MSVCRT dll,这种依赖关系导致递归调用。当我试图从目标应用程序获取任何调用的调用堆栈时,dbghelp在内部调用了MSVCRT中的某个方法,而该方法又调用了HeapAlloc。由于我已经对MSVCRT打了补丁,这会导致无限循环。

有没有人面对过这个问题并解决了它?有没有办法走出僵局?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-11 05:32:40

这是函数截取代码中的一个标准问题。我们在使用共享内存存储日志级别信息的日志库中遇到了类似的问题,而共享内存库必须记录信息。

我相信,我们解决问题的方法也适用于你的情况。

在你的截取代码中,维护一个静态标志,表明你是否在截取过程中。当您的拦截被调用并且没有设置标志时,设置标志,然后执行您当前所做的操作,包括调用DbgHelp,然后清除标志。

如果在设置标志时调用截取,则只调用后端HeapAlloc代码,而不执行任何其他操作(包括调用DbgHelp,这是导致无限递归的原因)。

类似于(伪代码)的东西:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2009-05-11 05:30:55

使用一些真实的内存跟踪产品怎么样,比如GlowCode

票数 0
EN

Stack Overflow用户

发布于 2010-11-16 04:02:47

您可以使用Deviare API Hook并获得完整的堆栈跟踪,而无需使用存在大量问题的API。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/846807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档