過濾器斷點

本篇博客是VisualStudio斷點調試系列文章的一部分,示例中使用的代碼available to download.html

過濾器斷點能夠對程序的同一個方法運行在屢次併發狀況下很是有幫助。考慮這個例子併發調用FindPrime() 4次。web

你注意下 FindPrime() 函數調用 IsPrime()幾回。 證實這個問題,當咱們在IsPrime()裏設置傳統的斷點以後發生了什麼。首先像咱們指望的在函數裏命中了斷點。api

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。若是你的代碼是併發訪問在不一樣的進程或者是不一樣的機器,你也能夠以一樣的技巧用相應的過濾器。post

首先咱們必須指出在哪一個線程上停下。這樣作,咱們設置一個傳統斷點在FindPrime()。當咱們停在這個斷點,咱們能夠用線程窗口來查看線程ID是11816線程

clip_image010

如今咱們能夠回到IsPrime 的斷點處設置過濾。調試

clip_image011

接下來咱們能夠按照咱們指望的行爲下一步下一步經過這個函數component

clip_image012

clip_image013

clip_image014

clip_image015

這個方法的一個缺點是須要你每次從新運行程序後去找到線程ID。爲了不這種狀況,你能夠用名字替換ID

clip_image016

而後應用這個替換成名字的過濾器,將不會在調試會話之間改變。

clip_image017

這裏提醒一下,若是你用的是task或者是threadpool的thread只能命名一次,可能不工做。

相關文章
相關標籤/搜索