本篇博客是VisualStudio断点调试系列文章的一部分,示例中使用的代码available to download。html
在以前的博文里, 咱们展现了命中断点和过滤器断点,他们能够帮助开发者缩小问题的范围。条件断点的也是相同的,可是能提供更多的灵活性,它容许开发者用任何有效的表达式来自定义条件。web
咱们举例说明一种条件断点的用法,此次使用C++例子。咱们注意到咱们的程序中有一个内测泄露,咱们用条件断点帮助追踪它。程序的ddRef 和Release函数和一个对象有泄露,当程序在一个对象中调用AddRef次数比调用Release多时。咱们要经过使用追踪点来追踪AddRef和Release函数。api
在每一次通过这些追踪点时打印出ulcRef的值和当前的堆栈。函数
甚至不用到第二个追踪点,我能在这里看到我有不少信息。看倒两次调用AddRef 两次的 refcount的值 都是 1。这是由于我看到所有对象被AddRef调用所输出 。this
为了缩小范围,咱们设置一个条件断点在这个追踪点上以便于我只看发生泄漏对象的输出。而后,咱们先经过在构造函数里设置一个断点来获得发生泄漏对象的内存地址。 这种状况下,咱们设置一个命中计数断点由于咱们只想准确命中一次。 调试
如今获得了泄漏的对象地址,咱们能够回到追踪点处添加一个条件。右击追踪点,点击 Condition…component
而后设置这个条件匹配“this“的值,就是刚从构造函数中查到的值。server
建立一样的条件给两个追踪点。如今当你继续执行,你能够看到刚刚那个对象的输出打印在Output window上。htm
就是这么简单的看到对象有两次调用AddRef 和一次调用release。基于堆栈还看到这个release是被destructor调用的,它是和第一个被destructor调用的AddRef 是一对的。这使得CleanUp 函数的AddRef 是额外的一个,须要被移除掉(或者给它调用个Release方法配成一对),到此为止咱们的溢出问题解决了。