为什么在命中断点后变量的值会发生变化?

时间:2012-10-22 23:18:22

标签: c# visual-studio debugging visual-studio-2012 conditional-breakpoint

我正在尝试调试大约30%的时间失败的单元测试。这似乎是某种计时问题,因为不幸的是,当我在代码中有断点时它永远不会失败。

因此,我在有问题的断言处设置了一个条件断点,当断言将为false时触发。正如预期的那样,我在1/3的时间内达到了断点。但是,当我实际检查表达式的值时,一切看起来都没问题。而且,果然,如果我继续,测试成功。

任何人都可以帮助我理解为什么会这样吗?如果另一个线程正在修改该值,那么当我点击断点时线程是否会停止?或者有可能发生这样的事情:

  1. 检查条件......评估为真
  2. 另一个线程修改变量
  3. 我真的不是在寻找我的问题的具体解决方案(合理发布的代码太多,或者期望任何人跋涉)。我只是在寻找有关条件断点如何工作的一般性输入,以及可能发生这种情况的原因。

    注意:我正在使用Visual Studio 2012(如果重要的话,还有.NET 4.0 C#。)

    另请注意:

    这是失败的断言:

    foreach (KeyValuePair<Guid, DateTime> time in state.Times) {
        Assert.IsTrue(time.Value > DateTime.Now.AddYears(2) && time.Value <= DateTime.Now.AddYears(3));
    }
    

2 个答案:

答案 0 :(得分:2)

您是否碰巧有get {}个副作用?在观察对象状态时,您可能会更改对象的状态。

例如:

class A {
    int one = 0;

    int two { 
        get { 
            one = 1; 
            return 2; 
        } 
    }
}

现在当你断言A.one == 1时,它就失败了。如果你看一下,你就会看到two == 2one == 1。当您再次尝试重试时,断言会通过,因为您已更改A.one

编辑:

看到您的代码,DateTime.Now每次调用时都会更改。你不认为那可能吗?

答案 1 :(得分:0)

我也遇到过这个问题。我有以下情况。我向外部设备发送命令,并启动计时器以听取答案。

如果我没有使用断点,它运行正常,没有错误。但是当我使用断点时,大约有70%的时间我遇到了错误。

问题是什么?通过断点,我停止了我的代码监听。但该设备不断发送信息;它确实发送了我正在寻找的答案,而我的代码不再是在听了。

希望这会有所帮助:)

相关问题