c# - 调试器进入条件为假的 if() block

标签 c#

给出这段代码:

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 分支,但不会抛出异常:

enter image description here

我处于 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/

相关文章:

c# - 不可变变量和不可变对象(immutable对象)

c# - 用于将双数组转换为逗号分隔字符串的 lambda 表达式

c# - MVC 3 逆向工程数据库然后切换到代码优先

c# - C# 如何获取更新记录的ID

c# - .NET Core (MYSQL) Generic Repository AutoWiring 使用 Autofac

c# - 识别 LINQ 表达式中的索引器

c# - 在 if 语句中检查当前页面的 url

c# - Javascript 警报不显示

c# - wpf DataGrid - 仅按命令排序

c# - C#中根据字符串标识符创建类对象