堆损坏双重释放内存
Heap Corruption double freeing memory
我有一个应用程序的堆损坏崩溃,所以我从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调试器一起使用时)。
希望这有帮助拉兹万。
如果运行调试版本,则很有可能会看到更多的调用堆栈。
另请参阅此链接
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?