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

C# 在VS2010中放置断点是否会影响程序的运行时行为?,c#,visual-studio-2010,debugging,breakpoints,C#,Visual Studio 2010,Debugging,Breakpoints,一段时间以来,我一直在研究这个问题,很明显,普通断点的放置会显著影响程序的运行时行为 我在这里说的是条件断点,例如,当将断点条件设置为var==null时,这种情况从未发生过,但当我删除断点时,var==null的情况经常发生 可能是这样吗 附录: 我的代码是多线程的,所以很难发布代码来重现错误。基本上我有两条线。一个是将项目排队,另一个是从队列中永久性地释放项目。在下面截取的代码中,我遇到了这样一种情况:第一个线程从未将空项目排队,但由于某种原因,它们正在找到进入队列的方式。这让我插入if语句

一段时间以来,我一直在研究这个问题,很明显,普通断点的放置会显著影响程序的运行时行为

我在这里说的是条件断点,例如,当将断点条件设置为
var==null
时,这种情况从未发生过,但当我删除断点时,
var==null
的情况经常发生

可能是这样吗

附录:

我的代码是多线程的,所以很难发布代码来重现错误。基本上我有两条线。一个是将项目排队,另一个是从队列中永久性地释放项目。在下面截取的代码中,我遇到了这样一种情况:第一个线程从未将空项目排队,但由于某种原因,它们正在找到进入队列的方式。这让我插入if语句,以防止出现NullReferenceException。虽然我的程序是临时性的,但从那时起就开始运行了。然后,我感兴趣的是null项从队列中退出队列的频率,我在if语句的行中放置了一个条件断点,条件为
inv==null
。现在的效果是,当有断点时,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();

                    }
                }
            }
        }
当队列中的某些项开始为空项时,我的问题再次出现,尽管我从未添加空项。即使出于这个原因,我也放置了一行,当有空值时抛出异常。该异常从未被抛出,但我的队列中仍然有null项,我不知道为什么

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();
        }
    }
“条件断点”肯定会影响计时。如果你有比赛条件,它肯定会改变你的行为。你也可以开始看到超时

这是因为在大多数处理器上没有真正的“条件断点”。实际上,您拥有的是“断点,然后有条件地自动恢复执行”,即使在条件不满足时,这也相当慢,因为调试器断点处理程序必须运行、读取内存、测试条件,然后发出continue命令


既然您已经发布了代码,我想我看到了问题所在

您没有检查
TryDequeue
的返回值。当无需出列时,inv将为
null
,这不是因为
null
已放入队列,而是因为队列中根本没有项目。

条件断点肯定会影响计时。如果你有比赛条件,它肯定会改变你的行为。你也可以开始看到超时

这是因为在大多数处理器上没有真正的“条件断点”。实际上,您拥有的是“断点,然后有条件地自动恢复执行”,即使在条件不满足时,这也相当慢,因为调试器断点处理程序必须运行、读取内存、测试条件,然后发出continue命令


既然您已经发布了代码,我想我看到了问题所在


您没有检查
TryDequeue
的返回值。当无需出列时,inv将为
null
,这不是因为
null
已放入队列,而是因为队列中根本没有项目。

这些断点应该不会影响代码执行(除了减慢标记的代码行)。您确定没有意外写入
var=null
或类似内容吗?这也可能是一些与时间有关的问题(例如,您的代码速度较慢,因此某些多线程情况/竞争条件发生得较少),但最终很难判断-至少使用这些断点不会造成一般问题或缺点。

这些断点根本不会影响您的代码执行(除了减慢标记的代码行的速度外)。您确定没有意外地写入
var=null
或类似的内容吗?这也可能是一些与时间相关的问题(例如,您的代码速度较慢,因此某些多线程情况/争用情况很少发生),但最后真的很难说出来-至少使用这些并不是一般性的问题或缺点。

无论我在哪里设置断点,我都看不到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()); }
    }
系统对象
x为空


无论我在哪里设置断点,我都看不到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()); }
    }
系统对象
x为空


发布您的代码。让我们看看是否可以重现错误。@GrayFox374请参阅我上面的附录。谢谢,更多信息几乎总是好的。如果您在没有断点的情况下运行应用程序,您如何确定队列中的空值?如果该异常从未抛出,即使有断点,也可能不在正确的位置。请注意出现在监视列表中?发布您的代码。让我们看看是否可以重现错误。@GrayFox374请参阅上面的附录。谢谢,更多信息几乎总是好的。如果您在没有断点的情况下运行应用程序,您如何确定队列中的空值?如果该异常从未抛出,即使有断点,也可能是not在正确的位置。Watch出现在监视列表中?不,我已经明确地编写了
var==null
,它严重影响变量
var
的内容(无论它是否为null).BenVoigt在他上面的帖子中说的话对我来说也是可以想象的,但是我的断点对我整个执行的影响非常大,所以我真的不确定我在这里经历了什么样的影响..不,我肯定写了
var==null
,它严重影响了变量
var
(不管它是空的还是不空的。)@BenVoigt在他上面的帖子中所说的话听起来也是可以想象的