我有一个混合模式项目,我在其中启动本机c ++代码并加载和使用一些c#4.7.2程序集。很长时间以来,它都运行良好,但是我偶然发现了一个问题。 仅C#单元测试可以正常工作。禁用混合模式调试时,仅C ++单元测试调用托管工作正常。启用混合模式调试时,可以从本机do manage开始进行调试会话,但是遇到某些特定的代码段时,我会出现clr.dll崩溃,地址0上存在访问冲突:
在以下位置抛出异常:0x00007FFAF53A2774(clr.dll) server_unittests.exe:0xC0000005:访问冲突读取位置 0x0000000000000000
它是确定性的,并在从派生类中调用基本构造函数时发生。
代码可以正常工作,没有任何泄漏,也可以调试,但是从非托管状态启动会话时,代码就会死掉。大致如下:
public DerivedData(uint customerId, bool load) : public BaseData(int customerId, string idName, string table, HashSet<(string colName, Constants.DbTypes colType, bool client, int verbosity)> vars, BaseData initialValues = null)
并在应进入基类构造函数代码时崩溃。
对于人与人桥,我使用3F / DllExport项目。我有最新的vs 2017。
请帮助我找到导致崩溃的模式,或将其指向一些GUI配置,使其消失:)
在一些选项旋转之后,它开始引发另一个错误:
托管调试助手“ FatalExecutionEngineError”已在“ server_unittests.exe”中检测到问题。 附加信息:运行时遇到致命错误。错误的地址位于线程0x1a6c上的0xf53a2774。错误代码为0xc0000005。此错误可能是CLR或用户代码中不安全或不可验证部分的错误。该错误的常见来源包括COM-interop或PInvoke的用户封送处理错误,这些错误可能会破坏堆栈。