鉴于此代码宝石:
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语句。实际上它确实 - 并且它跨过了投掷,但实际上没有投掷!
现在这只发生在if语句中有一个异常,后面是一个try / catch块,在Visual Studio 2013上,针对.NET Framework 4,64位,“首选32位”未选中。
我已经在不同的机器上与同事证实了这种奇怪之处。虽然以下代码和调试器似乎步入if分支,但没有抛出异常:
我处于调试模式,我多次尝试编译和清理项目。
任何人都可以解释为什么会这样吗?
答案 0 :(得分:28)
这是由x64抖动引起的已知问题,它偶尔会生成错误的调试行号信息。当语句导致生成额外的NOP指令(旨在对齐代码)时,它可能会摸索。第一个NOP变为行号,而不是NOP之后的指令。这个字节在几个地方,就像一个简单的if()测试和使用后的一个throw语句。具有简单标量操作数的运算符。这些对齐NOP也是中止线程如此危险的原因,如this post中所述。
最简单的解决方法是Project + Properties,Build选项卡,勾选“Prefer 32-bit”选项(如果可用),否则将Platform目标设置为x86。请注意,实际上没有任何错误,而调试器建议执行throw语句,程序实际上不会抛出异常。
正在进行中,x64抖动被彻底改写,一个名为RyuJIT的项目。它将在VS2015中发布,目前处于预览状态。
答案 1 :(得分:20)
查看this链接。这是Visual Studio和.NET框架版本的某些版本中的已知错误。它是完全无害的,你必须忍受的东西。