在VS 2008中进行调试时,为什么调试器会出现在第二个返回语句中?

时间:2010-04-30 18:26:15

标签: c# visual-studio-2008 debugging

调试以下控制台程序时:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(DoIt(false));

        Console.WriteLine(DoIt(true));
    }

    private static Boolean DoIt(Boolean abort)
    {
        try {
            throw new InvalidOperationException();
        } catch(Exception ex) {
            if (abort) {
                return true;
            }

            Console.WriteLine("Got here");
            return false;
        }
    }
}

为什么IDE在第二次调用DoIt()时会出现在第二个return语句中?执行结果是正确的,但调试经验是误导性的。

这是一个已知问题吗?

VS 2010中的行为是否相同?

3 个答案:

答案 0 :(得分:0)

它在VS2010中没有这样做。对DoIt的第一次调用打印了Got here并点击第二个返回语句。第二个调用命中第一个返回语句。

答案 1 :(得分:0)

如果您正在运行优化构建,则优化程序可能决定取消其中一个返回。这是一个相当常见的优化(我不知道为什么,我从观察调试器中学到了很多优化器,但是就我想知道的那样,他们做的是魔术:))当这种情况发生时,调试器(或更准确地生成调试器用来确定你所使用的代码行的元数据必须选择其中一个,在你的例子中它有五十五个错误的机会。

虽然这是一种误导性的体验,但这只是调试优化代码的一部分经验。唯一的选择是不优化代码,这不会很好。

答案 2 :(得分:0)

这是64位版JIT编译器的一个缺陷。看起来它不会生成完全正确的机器代码地址到语句调试映射数据。它只是有点准确,“return true”语句实际上跳转到方法结束时的return语句。但它本应该击中结束,而不是“返回虚假”声明。

在J86编译器的x86版本中不存在此错误。您通常希望在调试期间使用该抖动,它支持Edit + Continue。 Project + Properties,Build选项卡,Platform Target = x86。对于新项目,这在VS2010中是自动的。

您可以在connect.microsoft.com上报告错误