给出这段代码:
class Program
{
private static bool IsAdmin = true;
static void Main(string[] args)
{
if (!IsAdmin)
{
throw new Exception();
}
try
{
var x = 2342342;
var y = 123132;
}
catch (Exception)
{
throw;
}
}
}
鉴于 this.IsAdmin
产生 true - 我希望调试器不会输入该 if 语句。实际上它确实如此 - 它跨过 throw 但实际上并没有 throw !
现在,只有在 if 语句中有异常后跟 try/catch block 时才会发生这种情况,在 Visual Studio 2013 上,针对 .NET Framework 4,64 位,“首选 32 位”未选中。
我已经与不同机器上的同事确认了这种奇怪现象。单步执行以下代码,调试器似乎会进入 if 分支,但不会抛出异常:
我处于 Debug模式,我已经多次尝试编译和清理项目。
谁能解释为什么会这样?
最佳答案
这是一个由 x64 抖动引起的已知问题,它偶尔会生成错误的调试行号信息。当语句导致生成额外的 NOP 指令以对齐代码时,它可能会出错。第一个 NOP 成为行号,而不是 NOP 之后的指令。这个字节在几个地方,比如简单的 if() 测试和使用 ?? 之后的 throw 语句。具有简单标量操作数的运算符。这些对齐 NOP 也是中止线程如此危险的原因,如 this post 中所述。 .
最简单的解决方法是 Project + Properties,Build 选项卡,勾选“Prefer 32-bit”选项(如果可用),否则将 Platform target 设置为 x86。请注意实际上并没有出现任何错误,而调试器建议将要执行 throw 语句,而您的程序实际上并没有抛出异常。
正在开发中,彻底重写了 x64 抖动,一个名为 RyuJIT 的项目。它将在 VS2015 中发布,目前处于预览阶段。
关于c# - 调试器进入条件为假的 if() block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551032/