调试器步入if()块,其中condition为false

34 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果this.IsAdminyield为true,我希望调试器不要输入if语句.实际上它确实 - 并且它超过了投掷,但实际上没有投掷!

现在,这只发生在if语句中有一个异常后跟一个try/catch块,在Visual Studio 2013上,针对.NET Framework 4,64位,"首选32位"未选中.

我已经与不同机器上的同事证实了这种奇怪之处.步骤虽然以下代码和调试器似乎步入if分支,但没有抛出异常:

在此输入图像描述

我处于调试模式,我已经多次尝试编译和清理项目.

任何人都可以解释为什么会这样吗?

Han*_*ant 29

这是由x64抖动引起的已知问题,它偶尔会生成错误的调试行号信息.当语句导致生成额外的NOP指令(旨在对齐代码)时,它可能会发生错误.第一个NOP变为行号,而不是NOP之后的指令.这个字节在几个地方,就像一个简单的if()测试和使用后的一个throw语句.具有简单标量操作数的运算符.这些对准的NOP也是为什么如此危险的中止线程,所述的理由这一职位.

最简单的解决方法是Project + Properties,Build选项卡,勾选"Prefer 32-bit"选项(如果可用),否则将Platform目标设置为x86.请注意,实际上没有任何错误,而调试器建议执行throw语句,程序实际上不会抛出异常.

正在研究中,x64抖动被彻底改写,一个名为RyuJIT的项目.它将在VS2015中发布,目前处于预览版.

  • 谢谢.他们在想什么? (4认同)

Dan*_*anL 21

请参阅以下链接.这是Visual Studio和.NET框架versiosn的某些版本中的已知错误:

http://whileicompile.wordpress.com/2010/07/02/visual-studio-bug-if-followed-by-a-try-catch-causes-debugger-stepping-error/

它完全无害,你必须忍受的东西.

  • 我的理智仍然很机智,一切都很好! (5认同)