C# 调试器进入条件为false的if()块
鉴于这一系列代码:C# 调试器进入条件为false的if()块,c#,C#,鉴于这一系列代码: class Program { private static bool IsAdmin = true; static void Main(string[] args) { if (!IsAdmin) { throw new Exception(); } try { var x = 2342342;
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语句。事实上,它确实是这样的——它跨过了投掷,但实际上并没有投掷
现在,只有在Visual Studio 2013上,针对.NET Framework 4,64位,“首选32位”未选中时,if语句中出现异常,后跟try/catch块,才会发生这种情况
我与不同机器上的同事确认了这一奇怪现象。单步执行以下代码,调试器似乎会单步执行if分支,但不会引发异常:
我处于调试模式,我多次尝试编译和清理项目
有人能解释为什么会发生这种情况吗?请查看链接。在某些版本的visual studio和.NET framework版本中,这是一个已知的错误。这是一个由x64抖动引起的已知问题,它偶尔会生成错误的调试行号信息。当一条语句导致生成额外的NOPs指令以对齐代码时,它可能会出错。第一个NOP成为行号,而不是NOP之后的指令。在一些地方,例如在简单的if()测试和使用??具有简单标量操作数的运算符。这些对齐NOP也是中止线程如此危险的原因,如中所述 最简单的解决方法是项目+属性,构建选项卡,勾选“首选32位”选项(如果可用),否则将平台目标设置为x86。请注意,在调试器建议执行throw语句时,实际上没有出现任何错误。您的程序实际上不会抛出异常
它正在工作中,x64抖动被彻底重写,一个名为RyuJIT的项目。它将在VS2015中发布,目前正在预览中。我的理智保持得体,一切都很好!谢谢-唯一的问题是我花了这么长时间试图找出我的代码哪里不好-你不认为微软的东西会是罪魁祸首!谢谢他们到底在想什么。PS。。。今天遇到了这个问题。。。在VS2015中:(很好的发现,调试器对IL做了各种疯狂的事情,可能是预优化变量重新排序之类的