mar*_*man 1 c# debugging breakpoints visual-studio-2010
我现在已经研究过这个问题了一段时间,我觉得普通断点的位置会大大影响程序的运行时行为.
我在这里讲的是条件断点,例如当设置断点条件时,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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题再次开始,当队列中的一些项目开始是空项目,虽然我从来没有添加空项目.即使是因为这个原因,我已经放置了一行,当有空的东西时抛出异常.永远不会抛出异常,但我的队列中仍然有空项目,我不知道为什么.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*igt 10
"条件断点"肯定会影响时机.如果你有竞争条件,它肯定会改变行为.你也可以开始看到超时.
这是因为在大多数处理器上没有真正的"条件断点".你实际拥有的是"断点,有条件地通过自动恢复执行",即使条件不满足也很慢,因为调试器断点处理程序必须运行,读取内存,测试条件,然后发出一个继续.
既然您已经发布了代码,我想我已经看到了问题.
你没有检查的返回值TryDequeue.当没有任何东西可以出列时,inv将是null,不是因为null被放入队列,而是因为队列中根本没有任何项目.