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

标签 c++ windbg heap-corruption

我有一个应用程序的堆损坏崩溃,所以我从 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/

相关文章:

c - 尝试释放二维数组时堆损坏

c# - 调试 Windows Phone 应用程序时无法理解此 Windbg 输出

C++通过制作索引数组进行排序

c++ - 如何使用新版本的Node Nan Persistent

c++ - 如何最好地保存 XML 文件

windows - WinDbg 窗口符号

x86 - 我可以在x64 WIN7上同时安装x86/x64 windbg吗?

c++ - 是否可以保护内存区域免受 WinAPI 的影响?

使用 delete [] 和重载 += 的 C++ 堆损坏

c++ - 我如何在后台的 dll 中使用 muti boost 线程