c# - c# 4.7.2 在调试和从本机启动时在 clr.dll 中崩溃
问题描述
我有一个混合模式项目,我在其中启动本机 c++ 代码并加载和使用少量 c# 4.7.2 程序集。它工作了很长时间,但我偶然发现了一个问题。仅 C# 单元测试工作正常。当禁用混合模式调试时,C++ 仅单元测试调用托管工作正常。当我启用混合模式调试时,我可以从 native do manage 开始进行调试会话,但是当我进入一些特定的代码时,我得到一个 clr.dll 崩溃,地址 0 上存在访问冲突:
server_unittests.exe 中的 0x00007FFAF53A2774 (clr.dll) 引发异常: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)
并在它应该进入基类构造函数代码时立即崩溃。
对于 man-unman 桥,我使用 3F/DllExport 项目。我有最新的vs 2017。
请帮我找到导致它崩溃的模式或将我指向一些 GUI 配置,这使它消失:)
在一些选项旋转之后,它开始抛出一个不同的错误:
托管调试助手“FatalExecutionEngineError”在“server_unittests.exe”中检测到问题。附加信息:运行时遇到致命错误。错误地址位于线程 0x1a6c 上的 0xf53a2774。错误代码为 0xc0000005。此错误可能是 CLR 中的错误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。
解决方案
推荐阅读
- javascript - 如何使用 CSS 或 JavaScript 使新的 Google 搜索看起来像旧的 Google 搜索?
- python - 我正在尝试计算某个值中有多少出现在字典中并将其输出到字典中
- python - Numpy 数组计算问题,int 类型,int32 与 int64
- azure - NotificationHub:有没有办法通过 PushChannel 检索/删除安装?
- woocommerce - Woocommerce 交换公司名称和名称
- ruby - 如何在 Clojure 中读取 Ruby 以 AES 256 CBC 加密的文件/文本
- python - 存储子图的非浪费方式
- python - 不断收到错误消息“已超出未经验证使用的每日限制。继续使用需要注册。”
- javascript - 如何将网站链接添加到随机图像生成器
- python - Azure CLI:UnicodeEncodeError:'ascii'编解码器无法在位置 598 编码字符 u'\u2018':序数不在范围内(128)