我在 C++ 应用程序中通过 COM 调用的 C# 库模块中出现堆损坏错误。具体错误是:
HEAP: Free Heap block 4b61bb8 在被释放后修改为 4b61be8
...
这可能是由于堆损坏,并表明 [app].exe 或它已加载的任何 DLL 中的错误。
调用堆栈的顶部是:
CustomMarshalers.dll!System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext() + 0x168 bytes
现在我的理解是 .NET 应该缓解内存问题,而不是让更多的内存问题无法修复。然而,我想不出我可能会做什么来导致内存错误,或者我可能会如何尝试修复它。特定模块使用 Microsoft.VisualStudio.VCProjectEngine .NET 组件通过非常简单的迭代器来迭代 VC 项目文件。在成功完成之前的大约 100 次调用之后,它在迭代 VCProject 过滤器(文件夹)中的文件时中断了 foreach 语句。正在破坏的实际代码是:
IVCCollection CollectionFiles = (IVCCollection)FolderInProject.Files;
foreach (VCFile File in CollectionFiles)
{
[...]
}
我怎么可能去调试呢?
更新:
当我从纯 C# 控制台应用程序(不涉及 COM 或本机代码)调用 if 时,我得到:
[component].dll 中出现“System.AccessViolationException”类型的未处理异常
附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
仍然不知道如何进行调试。显然某处发生了内存错误......但是我如何在内存模型甚至没有暴露的纯托管代码中追踪它?