gpt4 book ai didi

c++ - 堆损坏双重释放内存

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:41 24 4
gpt4 key购买 nike

我有一个应用程序的堆损坏崩溃,所以我从 gflags 打开页面堆并为该应用程序收集了一个崩溃转储文件。

从转储文件中我发现这是由于双重释放内存造成的。

这是一个例子,我从调用堆栈中找到了这个

msvcr100!free(void * pBlock = "**Address**")

然后我做了这个

!heap -p -a <address>

address found in
_HEAP @
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
Address 000a 0000 [02] address 00003 - **(free )**
Trace: <1>
<2>
<3>

所以我们可以看到它试图双倍释放内存并导致崩溃。我的问题是我们可以看到在此操作之前更改或释放该内存的调用堆栈吗?是否可以?

我可以看到 !heap -p -a 命令下面的痕迹是释放内存的那个?如果是这样,我只能看到调用堆栈的一部分,有什么方法可以看到整个调用堆栈或手动遍历调用堆栈以查看哪个操作释放了该内存块。

最佳答案

如果您有源代码,您可以用您自己的函数替换 delete/free 函数,这些函数可以在实际发布之前捕获堆栈。

在 Windows 上,您可以使用函数 CaptureStackBackTrace 获取调用堆栈,但是此函数返回一组指针,您需要将它们转换为符号名称。为此,您可以使用 SymInitialize,然后对于每个指针,您可以使用 SymFromAddr 来获取符号的名称。名称是您要搜索的实际函数。

然而,在 Windows 上使用调试器会更容易。还有 Application Verifier,它是 Microsoft 的一个应用程序,可以帮助您捕获堆损坏(当与 visual studio 调试器一起使用时)。

希望对你有帮助拉兹万。

关于c++ - 堆损坏双重释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19593689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com