鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > .net技术 > vs2010 > >

过滤器断点

来源:互联网 作者:佚名 时间:2013-12-10 13:17
本篇博客是VisualStudio断点调试系列文章的一部分,示例中使用的代码available to download. 过滤器断点可以对程序的同一个方法运行在多次并发情况下非常有帮助。考虑这个例子并发调用FindPrime() 4次。 你注意下 FindPrime() 函数调用 IsPrime()几次。 证明

本篇博客是VisualStudio断点调试系列文章的一部分,示例中使用的代码available to download.

过滤器断点可以对程序的同一个方法运行在多次并发情况下非常有帮助。考虑这个例子并发调用FindPrime() 4次。

你注意下 FindPrime() 函数调用 IsPrime()几次。 证明这个问题,当我们在IsPrime()里设置传统的断点之后发生了什么。首先像我们期望的在函数里命中了断点。

clip_image001

但是我们继续下一步下一步的执行,,注意到一些奇怪的行为。

clip_image001[1]

clip_image002

clip_image003

clip_image004

clip_image005

clip_image006

我们似乎是在四处乱跳。这是因为当你下一步下一步走的时候不同的线程命中同一个断点。然后编辑器在每一步完成的时候停下。 这些事件的顺序是不确定的,所以你下一步执行可能去不同的线程了。用过滤器断点,替换刚才的断点你可以只关注一个线程。去创建一个过滤器断点,右键选择过滤器。

clip_image007

呼出过滤器断点对话窗。你将注意到这个对话框有5个不同的过滤器断点: MachineName, ProcessId, ProcessName, ThreadId, 和ThreadName.

clip_image008

由于我们关注的是在单线程运行IsPrime(),我们将过滤ThreadId。如果你的代码是并发访问在不同的进程或者是不同的机器,你也可以以同样的技巧用相应的过滤器。

首先我们必须指出在哪个线程上停下。这样做,我们设置一个传统断点在FindPrime()。当我们停在这个断点,我们可以用线程窗口来查看线程ID是11816

clip_image010

现在我们可以回到IsPrime 的断点处设置过滤。

clip_image011

接下来我们可以按照我们期望的行为下一步下一步通过这个函数

clip_image012

clip_image013

clip_image014

clip_image015

这个方法的一个缺点是需要你每次重新运行程序后去找到线程ID。为了避免这种情况,你可以用名字替换ID

clip_image016

然后应用这个替换成名字的过滤器,将不会在调试会话之间改变。

网友评论
<