【发布时间】:2018-04-05 07:43:56
【问题描述】:
我正在处理以下访问冲突:
Unhandled exception at 0x77DB2A10 (ntdll.dll) in <Process>.exe.dmp:
0xC0000005: Access violation reading location 0x184487B8. occurred
源码如下:
Result CParameter::SetValue(..., ..., <internal_Class>* pBlock, ...)
{
...
<internal_Class>* pStore = nullptr;
if (!pBlock)
{
pStore = &m_Data; // m_Data is a global variable
}
else pStore = pBlock;
if (pStore->pbData)
{
pStore->Clear(); // here we have the crash
}
调用堆栈如下所示:
ntdll.dll!_RtlpCoalesceFreeBlocks@16() Unknown Non-user code. Symbols loaded.
ntdll.dll!@RtlpFreeHeap@16() Unknown Non-user code. Symbols loaded.
ntdll.dll!_RtlFreeHeap@12() Unknown Non-user code. Symbols loaded.
ole32.dll!CRetailMalloc_Free(IMalloc * pThis=0x777476bc, void * pv=0x1842de40) Line 687 C++ Non-user code. Symbols loaded.
ole32.dll!CoTaskMemFree(void * pv=0x1842de40) Line 475 C++ Non-user code. Symbols loaded.
=> <Process>.exe!CParameter::SetValue(..., <internal_Class> * pBlock=0x00000000, ...) Line 5528 C++ Symbols loaded.
在监视窗口中,我看到 &m_Data 的以下值:
0x77e4f9ae {Inside ntdll.dll!_RtlpAnalyzeHeapFailure@12()} {pbData=0xd2b70f3d <Error reading characters of string.> ...}
更多信息:
-
pBlock的值为NULL - 调试器不知道
pStore的值
问题:
- 调用堆栈中的函数“Clear()”在哪里?
- 监视窗口中的值“RtlpAnalyzeHeapFailure”怎么样?这是否意味着我的转储已损坏到无法从中获取任何有用信息?
提前致谢
【问题讨论】:
-
看来问题出在
pStore->Clear();。 -
是否有任何
CoTaskMemAlloc/CoTaskMemFree或任何使用这些分配的OLE 函数? -
@BarmakShemirani:确实,我已经验证了代码,
CoTaskMemAlloc确实用于内存分配。 -
这只是一个沼泽标准堆损坏问题。当堆管理器倒下时,你得到了一个快照,你没有一个关于堆损坏的确切时刻的快照。这发生在早些时候,可以通过任何代码完成。这使得此类错误非常难以诊断。对于您知道存在损坏问题的程序,最好的方法是通过应用程序验证程序来完成它的步伐。
标签: c++ windows visual-studio crash dump