本篇博客是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方法配成一對),到此爲止咱們的溢出問題解決了。