我正在编写一个内存跟踪应用程序,它使用IAT补丁机制将所有调用挂接到HeapAlloc。这个想法是捕获所有对HeapAlloc的调用,并获得一个调用堆栈。
但是,我目前在使用DBGHELP Apis获取调用堆栈时遇到了一个问题。我发现dbghelp dll本身链接到MSVCRT dll,这种依赖关系导致递归调用。当我试图从目标应用程序获取任何调用的调用堆栈时,dbghelp在内部调用了MSVCRT中的某个方法,而该方法又调用了HeapAlloc。由于我已经对MSVCRT打了补丁,这会导致无限循环。
有没有人面对过这个问题并解决了它?有没有办法走出僵局?
发布于 2009-05-11 05:32:40
这是函数截取代码中的一个标准问题。我们在使用共享内存存储日志级别信息的日志库中遇到了类似的问题,而共享内存库必须记录信息。
我相信,我们解决问题的方法也适用于你的情况。
在你的截取代码中,维护一个静态标志,表明你是否在截取过程中。当您的拦截被调用并且没有设置标志时,设置标志,然后执行您当前所做的操作,包括调用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发布于 2009-05-11 05:30:55
使用一些真实的内存跟踪产品怎么样,比如GlowCode
发布于 2010-11-16 04:02:47
您可以使用Deviare API Hook并获得完整的堆栈跟踪,而无需使用存在大量问题的API。
https://stackoverflow.com/questions/846807
复制相似问题