在VS2010中放置断点是否会影响程序的运行时行为?

时间:2012-07-10 17:23:59

标签: c# visual-studio-2010 debugging breakpoints

我已经调查了这个问题,因为我觉得普通断点的位置会大大影响程序的运行时行为。

我在这里谈到条件断点,例如当将断点条件设置为var == null时,这种情况永远不会发生,但是当我删除断点时var == null经常发生的情况。

可能是吗?

附录

我的代码是多线程的,因此很难发布代码以重现错误。基本上我有两个线程。一个是将队列中的项目排队,另一个是从队列中永久地取消项目。在下面的代码中,我遇到的情况是第一个线程永远不会将空项排队,但由于某种原因,它们正在进入队列。这让我插入if语句以防止 NullReferenceException 。虽然作为一个临时的解决方法,我的程序确实从那时开始运行。然后我对null项从队列中出队的频率感兴趣,并且在带有条件inv == null的if语句的行中放置了一个条件断点。现在的效果是,当存在断点时,inv似乎永远不会为null,并且当没有断点时,inv似乎通常为null。

public void _dequeue () {

            while (!Signals.TerminateSignal.WaitOne(0, false)) {

                if (Signals.DequeueSignal.WaitOne()) {

                    lock (Queue) {

                        IInvocation inv;
                        Queue.TryDequeue(out inv);

                        // Conditional Breakpoint
                        if (inv != null)
                            inv.Invoke();

                        _poolHooks[PoolIndex].DecrementWaiting();
                        _poolHooks[PoolIndex].IncrementPending();

                        if (Queue.Count == 0) Signals.DequeueSignal.Reset();

                    }
                }
            }
        }

同样,当队列中的某些项目开始为空项目时我的问题开始了,尽管我从不添加空项目。即使是因为这个原因,我已经放置了一行,当有空的东西时抛出异常。永远不会抛出异常,但我的队列中仍然有空项,我不知道为什么。

public static void EnqueueInvocation (int poolIndex, IInvocation inv ) {

        if (inv == null) throw new Exception("Red Alert");

        lock (_deqThreads[poolIndex].Queue) {

            _poolHooks[poolIndex].IncrementWaiting();


            _deqThreads[poolIndex].Queue.Enqueue(inv);
            _deqThreads[poolIndex].Signals.DequeueSignal.Set();
        }
    }

3 个答案:

答案 0 :(得分:10)

“条件断点”肯定会影响时间。如果你有竞争条件,它肯定会改变行为。你也可以开始看到超时。

这是因为在大多数处理器上没有真正的“条件断点”。你实际拥有的是“断点,有条件地通过自动恢复执行”,即使条件不满足也很慢,因为调试器断点处理程序必须运行,读取内存,测试条件,然后发出一个继续。


现在您已经发布了代码,我认为我发现了问题。

您没有检查TryDequeue的返回值。当没有任何东西出队时,inv将是null,不是因为null被放入队列,而是因为队列中根本没有任何项目。

答案 1 :(得分:1)

这些断点根本不应影响代码执行(除了减慢标记的代码行速度)。你确定你没有意外地写var = null或类似的东西吗?它可能也是一些与时间相关的问题(例如你的代码速度较慢,因此一些多线程情况/竞争条件很少发生),但最终它很难说 - 至少它不是一般问题或缺点只是由于使用这些

答案 2 :(得分:1)

无论我在哪里设置断点,我都没有看到评估x的行为有什么不同。

    static void Main(string[] args)
    {
        var x = new object();
        if (x == null)
        { Console.WriteLine("x is null"); }
        else
        { Console.WriteLine(x.ToString()); }
        x = null;
        if (x == null)
        { Console.WriteLine("x is null"); }
        else
        { Console.WriteLine(x.ToString()); }
    }
  

System.Object的
  x为空