gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:52:43 26 4
gpt4 key购买 nike

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com