Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调试C#类库中的堆错误? 我在C语言库模块中得到了一个堆损坏错误,我在C++应用程序中通过COM调用。具体错误是:_C#_Visual Studio_Debugging_Memory_Interop - Fatal编程技术网

如何调试C#类库中的堆错误? 我在C语言库模块中得到了一个堆损坏错误,我在C++应用程序中通过COM调用。具体错误是:

如何调试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应该减轻内存问题,而不是制造更多无法修复的内存问题。然而,我想不出

堆:空闲堆块4b61bb8已修改 在释放后的4b61be8时
这可能是由于 堆损坏,并指示 [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自动化类有关,但我不知道如何调试它。