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