如何调试C#类库中的堆错误? 我在C语言库模块中得到了一个堆损坏错误,我在C++应用程序中通过COM调用。具体错误是:
堆:空闲堆块4b61bb8已修改 在释放后的4b61be8时如何调试C#类库中的堆错误? 我在C语言库模块中得到了一个堆损坏错误,我在C++应用程序中通过COM调用。具体错误是:,c#,visual-studio,debugging,memory,interop,C#,Visual Studio,Debugging,Memory,Interop,堆:空闲堆块4b61bb8已修改 在释放后的4b61be8时 这可能是由于 堆损坏,并指示 [app].exe中存在错误 或它已加载的任何DLL 调用堆栈的顶部是: CustomMarshalers.dll!System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext() + 0x168 bytes 现在我的理解是.NET应该减轻内存问题,而不是制造更多无法修复的内存问题。然而,我想不出
这可能是由于 堆损坏,并指示 [app].exe中存在错误 或它已加载的任何DLL 调用堆栈的顶部是:
CustomMarshalers.dll!System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext() + 0x168 bytes
现在我的理解是.NET应该减轻内存问题,而不是制造更多无法修复的内存问题。然而,我想不出我可能会做什么来导致内存错误,或者我可能会如何着手修复它。特定模块使用非常简单的迭代器,使用Microsoft.VisualStudio.VCProjectEngine.NET组件来迭代VC项目文件。它在重复VCProject过滤器(文件夹)中的文件时打断了foreach语句,之前大约有100次调用成功。正在中断的实际代码是:
IVCCollection CollectionFiles = (IVCCollection)FolderInProject.Files;
foreach (VCFile File in CollectionFiles)
{
[...]
}
我怎样才能调试这个呢
更新:
当我从纯C#控制台应用程序(不涉及COM或本机代码)调用if时,我得到:
类型的未处理异常
“System.AccessViolationException”
发生在[component].dll中附加的 信息:试图读取或删除 写保护内存。这是经常发生的事 另一个内存正在运行的指示 腐败
仍然不知道如何调试这个。显然某个地方发生了内存错误。。。但是,在内存模型甚至没有公开的纯托管代码中,我如何跟踪它呢?看起来您的COM接口没有正确封送参数/返回变量,导致GC意外释放托管内存,或者由于某些不正确的封送而损坏非托管内存。通过为COM组件构建自己的接口,可以对COM接口进行更细粒度的控制。只需做一点工作,您就可以检查COM对象上有问题的方法,并确保其所有参数都具有正确的元数据,以确保它们被正确封送 现在,另一种可能是您正确地封送了所有内容,但是您没有正确地调用接口,这表现为对参数的不当使用,最终会破坏非托管内存。这些都是不太有趣的跟踪,尤其是如果你没有访问COM源代码
一个技巧是允许程序在调试器外部崩溃,单击Debug,这将打开pick JIT debugger窗口。然后选中“选择调试引擎”(或类似的内容),并确保选中了托管和本机复选框。出现的VS实例应该在实际失效的代码中被破坏,而不是最接近失效的托管代码。看起来您的COM接口没有正确封送参数/返回变量,导致GC意外释放托管内存,或由于某些不正确的封送处理导致非托管内存被丢弃。通过为COM组件构建自己的接口,可以对COM接口进行更细粒度的控制。只需做一点工作,您就可以检查COM对象上有问题的方法,并确保其所有参数都具有正确的元数据,以确保它们被正确封送 现在,另一种可能是您正确地封送了所有内容,但是您没有正确地调用接口,这表现为对参数的不当使用,最终会破坏非托管内存。这些都是不太有趣的跟踪,尤其是如果你没有访问COM源代码
一个技巧是允许程序在调试器外部崩溃,单击Debug,这将打开pick JIT debugger窗口。然后选中“选择调试引擎”(或类似的内容),并确保选中了托管和本机复选框。出现的VS实例应该在实际死亡的代码中断开,而不是最接近死亡的托管代码。您是为COM模块构建了PIA,还是使用了预构建的PIA?什么是PIA?我构建公共界面,如果你是这么要求的话。我以前成功地构建和使用过COM对象,如果我立即返回,这一个就可以工作;它仅在使用VC.NET对象时失败。另外,请参阅我的后续文章。PIA:回答/编辑方面的要点很好,我已经相应地更新了原始问题。您是为COM模块构建了PIA,还是使用了预构建的PIA?什么是PIA?我构建公共界面,如果你是这么要求的话。我以前成功地构建和使用过COM对象,如果我立即返回,这一个就可以工作;它仅在使用VC.NET对象时失败。另外,请看我的followup.PIA:关于答案/编辑的问题,我已经相应地更新了原始问题;在我的测试控制台应用程序使用中没有COM使用。我怀疑这与VisualStudio自动化类有关,但我不知道如何调试它;在我的测试控制台应用程序使用中没有COM使用。我怀疑这与VisualStudio自动化类有关,但我不知道如何调试它。