跟踪内存泄漏时如何获取stacktrace? 我用C++编写了一个内存跟踪系统,用DeTrices来修补各种内存分配函数。除了malloc之外,当我收到对malloc的调用时,我还存储stacktrace(这样我就可以锁定泄漏点)

跟踪内存泄漏时如何获取stacktrace? 我用C++编写了一个内存跟踪系统,用DeTrices来修补各种内存分配函数。除了malloc之外,当我收到对malloc的调用时,我还存储stacktrace(这样我就可以锁定泄漏点),c++,memory-leaks,recursion,stack-overflow,C++,Memory Leaks,Recursion,Stack Overflow,获得准确堆栈跟踪的唯一可靠方法是使用StackWalk64(我尝试了RtlCaptureStackBackTrace,这只能生成非常简单的堆栈) 然而,我的问题是,StackWalk64调用malloc,而malloc反过来调用StackWalk64并导致堆栈溢出。现在我可以有一个处理递归调用的标志,但是这不适用于多线程 我想知道是否有人能解决这个问题 谢谢 Rich Carless您能在malloc实现中使用线程本地标志来防止对StackWalk64的递归调用吗?我们曾经遇到过一个类似的问题,

获得准确堆栈跟踪的唯一可靠方法是使用StackWalk64(我尝试了RtlCaptureStackBackTrace,这只能生成非常简单的堆栈)

然而,我的问题是,StackWalk64调用malloc,而malloc反过来调用StackWalk64并导致堆栈溢出。现在我可以有一个处理递归调用的标志,但是这不适用于多线程

我想知道是否有人能解决这个问题

谢谢
Rich Carless

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

我们曾经遇到过一个类似的问题,并通过将调试打印代码预链接到另一个(修改过的)malloc版本来解决它,该版本取自glibc,稍微修改以在预分配的缓冲区上操作(在我们的例子中,我们希望避免对操作系统的任何内存占用)。
不过,我不知道静态预链接在您的系统中有多困难。

您不能将该标志存储在FLS中吗(
FlsAlloc
FlsSetValue
FlsGetValue
和friends)?啊,也许我应该补充一下,该系统将在XP和Windows 2003上运行。是的,这已经解决了我的问题,我使用了以下链接: