c# - 为什么在 x64 版本上对 System.Numerics 函数进行断点编辑参数时会出现 FatalExecutionEngineError?

标签 c# .net

在 AnyCPU 或 x86 上,我可以运行这个程序,在 Foo 上设置一个断点,将第一个参数从 0.5f 编辑到 0.6f,然后恢复就好了。
但是,在 x64 上,它在恢复时始终因 FatalExecutionEngineError 崩溃。

using System;
using System.Numerics;

public static class Interaction
{
    public static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine(Foo.M11);
            System.Threading.Thread.Sleep(0);
        }
    }

    private static Matrix4x4 Foo
    {
        get
        {
            return Matrix4x4.CreateFromYawPitchRoll(0.5f /* breakpoint and set this to 0.6f*/, 0.5f, 0.5f);
        }
    }
}
fatalexecution
至少,它发生在 .NET Framework 4.7.2 和 .NET Framework 4.6.2 上。有没有办法解决这个问题?
编辑 :在 .NET Framework 4.8 上对其进行了测试,在阅读他们修复了该版本中的一些 x64 内容后,它仍然崩溃!

最佳答案

当在返回结构的方法上使用编辑并继续时,这似乎是 .NET Core 和 .NET Framework 中的一个已知问题。 (请参阅 GitHub 上的相关问题:EnC: ExecutionEngineException after edit in struct returning method)。
关于该问题的评论表明它可能会在 .NET 6 中得到修复。
编辑:
进一步研究这个问题后,在将编辑并继续更改应用于当前运行的方法时,这似乎是由于处理“变量数字”(分配给每个局部变量的内部索引)时的有符号/无符号不匹配造成的。
当应用编辑并继续更改时,运行时会分配数组来保存更改前后局部变量的信息,但是它必须考虑到最多有 4 个具有负变量编号的“特殊”局部变量的事实(-1 到 -4),所以它为数组分配了 4 个额外的条目,然后将 4 添加到每个局部变量号以确定它应该写入相应数组中的索引。
不幸的是,变量 number 存储在一个无符号字段中,并且在确定数组索引时错过了到有符号值的转换,因此对于特殊的局部变量,它不是写入数组的开头,而是计算一个大的正索引,尝试注销数组的末尾并导致访问冲突。
这些“特殊”局部变量之一是用于从方法返回结构的内存,这就是问题中的方法(实际上是任何返回结构的方法)触发问题的原因。

关于c# - 为什么在 x64 版本上对 System.Numerics 函数进行断点编辑参数时会出现 FatalExecutionEngineError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67829796/

相关文章:

c# - 缓存包含数据,但无法检索数据

.net - 具有 Appearance=Buttons 的 Windows TabControl,在右侧获得较大的边距

c# - 如何在 SqlParameter 中为数据类型位传递正确的对象值?

c# - Cygwin 中的 24 位控制台颜色 ANSI 代码

.net - .NET DateTime 中的空值是否保证小于实际值?

.net - 如何处理数据库事务中的文件删除?

c# - LINQ to SQL 不会生成 sargable 查询

c# - 在运行时向窗体添加 C# 标签

c# - BringIntoView 方法

c# - WCF 服务代理生成在通过 F5 负载平衡器公开时引发错误