堆损坏双重释放内存

Heap Corruption double freeing memory

本文关键字:释放 内存 损坏      更新时间:2023-10-16

我有一个应用程序的堆损坏崩溃,所以我从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 命令下方看到一个跟踪,那是释放内存的那个吗?如果是这样,我只能看到调用堆栈的某些部分,有什么方法可以查看总调用堆栈或手动浏览调用堆栈以查看哪个操作释放了该内存块。

如果您有源代码,则可以将删除/释放函数替换为您自己的函数,这些函数可以在实际发布之前捕获堆栈。

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

但是,在Windows上使用调试器会更容易。还有Application Verifier它是来自Microsoft的应用程序,可以帮助您捕获堆损坏(与Visual Studio调试器一起使用时)。

希望这有帮助拉兹万。

如果运行调试版本,则很有可能会看到更多的调用堆栈。

另请参阅此链接