x64编译下修改System.Numerics函数断点参数触发FatalExecutionEngineError怎么办
这个问题是.NET Framework x64 调试的**编辑并继续(EnC)**功能针对大值类型返回值处理的已知缺陷导致:
Matrix4x4是由16个float组成的64字节大值类型,x64架构下大值类型返回值的传递规则和x86不同,调试时修改参数后编辑并继续功能修复栈和寄存器状态时逻辑出错,直接破坏运行时内核结构,触发FatalExecutionEngineError。.NET Framework已进入维护模式,此类非安全级别的运行时缺陷微软不会再推送补丁修复,可选择以下方案规避:
- 代码层面改动最小的规避方案:修改Foo属性的getter逻辑,将返回值先存入局部变量再返回,避免JIT对大值类型直接返回做寄存器优化,修改后代码如下:
private static Matrix4x4 Foo { get { var result = Matrix4x4.CreateFromYawPitchRoll(0.5f /* 调试时修改该参数不会再触发崩溃 */, 0.5f, 0.5f); return result; } }
实测该改动在.NET Framework 4.6~4.8的x64配置下生效,调试时修改参数再继续执行不会触发崩溃。
- 若可迁移运行时:直接升级到.NET Core 3.1或更高版本(.NET 5/6/7/8),该系列运行时已完全修复x64编辑并继续的相关缺陷,相同操作场景不会出现崩溃。
- 若不能改代码也不能升级运行时:调试需要修改该参数时,临时将项目编译平台切换为x86进行调试,调试验证完成后再切回x64做发布编译即可。
- 若不需要调试时修改代码:可以在x64编译配置的生成选项里关闭「优化代码」,同时在调试设置中禁用「编辑并继续」功能,也可避免该崩溃问题。
内容的提问来源于stack exchange,提问作者Mr. Smith
相关产品推荐
相关产品推荐

