过滤器断点_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 过滤器断点

过滤器断点

 2013/10/14 12:43:16  allanxyq  博客园  我要评论(0)
  • 摘要:本篇博客是VisualStudio断点调试系列文章的一部分,示例中使用的代码availabletodownload.过滤器断点可以对程序的同一个方法运行在多次并发情况下非常有帮助。考虑这个例子并发调用FindPrime()4次。你注意下FindPrime()函数调用IsPrime()几次。证明这个问题,当我们在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

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

clip_image017

这里提醒一下,如果你用的是task或者是threadpool的thread只能命名一次,可能不工作。

  • 相关文章
发表评论
用户名: 匿名