如何在追踪内存泄漏时获取堆栈跟踪?

4
我用Detours在C++中编写了一个内存追踪系统,以修补各种内存分配函数。当我接收到malloc的调用时,除了malloc外,我还会存储堆栈跟踪(这样我就可以定位泄漏)。
获取准确堆栈跟踪的唯一可靠方法是使用StackWalk64(我尝试了RtlCaptureStackBackTrace,但只能捕获非常简单的堆栈)。
然而,我的问题在于,StackWalk64调用malloc,malloc再调用StackWalk64,导致堆栈溢出。现在我可以设置一个处理递归调用的标志,但这无法处理多个线程。
我想知道是否有人对此有可能的解决方案。
谢谢 Rich Carless

你不能将标志存储在FLS(FlsAllocFlsSetValueFlsGetValue等)中吗? - Remus Rusanu
啊,也许我应该补充说明一下,这个系统将在XP和Windows 2003上运行。 - Rich
2个回答

1

你能否在你的malloc实现中使用线程本地标志来防止对StackWalk64的递归调用吗?


是的,这解决了我的问题,这是我使用的链接:http://msdn.microsoft.com/zh-cn/library/ms686997(v=VS.85).aspx - Rich

0
我们曾经遇到过类似的问题,并通过将调试打印代码与另一个(修改后的)malloc版本进行预链接来解决它,该版本取自glibc并略微修改以在预分配缓冲区上操作(我们希望避免在我们的情况下向操作系统进行任何内存活动)。虽然我不能确定在您的系统中静态预链接有多困难。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接