条件断点

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

在之前的博文里, 我们展示了命中断点和过滤器断点,他们可以帮助开发者缩小问题的范围。条件断点的也是相同的,但是能提供更多的灵活性,它允许开发者用任何有效的表达式来自定义条件。

我们举例说明一种条件断点的用法,这次使用C++例子。我们注意到我们的程序中有一个内测泄露,我们用条件断点帮助追踪它。程序的ddRef 和Release函数和一个对象有泄露,当程序在一个对象中调用AddRef次数比调用Release多时。我们要通过使用追踪点来追踪AddRef和Release函数。clip_image002

在每一次经过这些追踪点时打印出ulcRef的值和当前的堆栈。clip_image003

现在我们运行程序可以看到以下输出。clip_image005

甚至不用到第二个追踪点,我能在这里看到我有很多信息。看倒两次调用AddRef 两次的 refcount的值 都是 1。这是因为我看到全部对象被AddRef调用所输出 。

为了缩小范围,我们设置一个条件断点在这个追踪点上以便于我只看发生泄漏对象的输出。然后,我们先通过在构造函数里设置一个断点来得到发生泄漏对象的内存地址。 这种情况下,我们设置一个命中计数断点因为我们只想准确命中一次。 clip_image006

现在得到了泄漏的对象地址,我们可以回到追踪点处添加一个条件。右击追踪点,点击 Condition…

clip_image007

然后设置这个条件匹配“this“的值,就是刚从构造函数中查到的值。clip_image008

创建同样的条件给两个追踪点。现在当你继续执行,你可以看到刚刚那个对象的输出打印在Output window上。

clip_image009

就是这么简单的看到对象有两次调用AddRef 和一次调用release。基于堆栈还看到这个release是被destructor调用的,它是和第一个被destructor调用的AddRef 是一对的。这使得CleanUp 函数的AddRef 是额外的一个,需要被移除掉(或者给它调用个Release方法配成一对),到此为止我们的溢出问题解决了。

posted @ 2013-10-17 16:34  allanxyq  阅读(1242)  评论(2编辑  收藏  举报