本篇博客是VisualStudio断点调试系列文章的一部分,示例中使用的代码available to download.
过滤器断点可以对程序的同一个方法运行在多次并发情况下非常有帮助。考虑这个例子并发调用FindPrime() 4次。
你注意下 FindPrime() 函数调用 IsPrime()几次。 证明这个问题,当我们在IsPrime()里设置传统的断点之后发生了什么。首先像我们期望的在函数里命中了断点。
但是我们继续下一步下一步的执行,注意到一些奇怪的行为。
我们似乎是在四处乱跳。这是因为当你下一步下一步走的时候不同的线程命中同一个断点。然后编辑器在每一步完成的时候停下。 这些事件的顺序是不确定的,所以你下一步执行可能去不同的线程了。用过滤器断点,替换刚才的断点你可以只关注一个线程。去创建一个过滤器断点,右键选择过滤器。
呼出过滤器断点对话窗。你将注意到这个对话框有5个不同的过滤器断点: MachineName, ProcessId, ProcessName, ThreadId, 和ThreadName.
由于我们关注的是在单线程运行IsPrime(),我们将过滤ThreadId。如果你的代码是并发访问在不同的进程或者是不同的机器,你也可以以同样的技巧用相应的过滤器。
首先我们必须指出在哪个线程上停下。这样做,我们设置一个传统断点在FindPrime()。当我们停在这个断点,我们可以用线程窗口来查看线程ID是11816
现在我们可以回到IsPrime 的断点处设置过滤。
接下来我们可以按照我们期望的行为下一步下一步通过这个函数
这个方法的一个缺点是需要你每次重新运行程序后去找到线程ID。为了避免这种情况,你可以用名字替换ID
然后应用这个替换成名字的过滤器,将不会在调试会话之间改变。
这里提醒一下,如果你用的是task或者是threadpool的thread只能命名一次,可能不工作。