標籤:tac 堆棧 ted 變化 編譯 glob 任務 函數調用 技術分享
1 相關概念
1)棧幀
C語言中,每個棧幀對應著一個未運行完的函數。棧幀中儲存了該函數的返回地址和局部變數。
棧幀也叫過程活動記錄,是編譯器用來實現過程/函數調用的一種資料結構。
2)逐步執行與單步函數執行
逐步執行又被稱為逐語句執行,單步函數執行又被稱為逐過程執行。單步函數執行不會進入函數體。
3)主線程不會顯示在Parallel Tasks 視窗中,因為主線程不是任務。但它會顯示在顯示線程的視窗中。
2 Parallel Tasks 視窗
開啟視窗:
斷點調試情況下,按F5或點擊“啟動調試”,如所示
在上步基礎上,點擊“調試”——>“視窗”:
在上步基礎上,點擊“任務”:
在上步基礎上,按右鍵任務視窗,調出菜單,可以調出為每一個任務分配的線程:
說明:
1)顯示沒有任務可顯示,這是因為,將斷點打到圖示位置,還沒有執行任務。
2)在Parallel Tasks 視窗中,雙擊一個任務,可顯示所選任務將要啟動並執行下一條語句。
3)任務還沒有分配時,Parallel Tasks 視窗中沒有任何資訊顯示,狀態中按F10逐過程執行,會出現一條資訊,如所示:
接著,繼續按F10,會出現第二條資訊,如所示:
上面兩幅圖中Parallel Tasks 視窗左側的黃色箭頭指示當前任務。
4)只關注一個任務
為了能夠在有多個任務並存執行的時候,專註觀察一個任務的執行情況,可使用“凍結線程”功能。
如所示,Parallel Tasks 視窗中有5個任務,其中1個已指派,4個在執行。
在中,右鍵,調出菜單,選擇 ,結果一次入下面兩幅圖:
中藍色的暫停標識表示被凍結的任務。
值得注意的是:我們的程式中有五個任務,然而這裡顯示四個任務在運行,還有一個已指派,那麼它是沒有被凍結的,所以還不能夠實現專註調試一個任務的目的,待到這個任務運行時,將其凍結後,才可專註調試一個任務。
是只有一個活動的任務。
再者:F10為逐過程運行,F11為逐句運行,調試時請使用F11,逐句調試更易發現問題。
5)切換到任務
在Parallel Tasks 視窗,右鍵點擊調出菜單,選擇“切換到任務”,可以定位到那個任務對應的匿名方法
3 Threads視窗
斷點調試狀態下,按F5或點擊“啟動調試”,然後點擊“調試”——>“視窗”——>“線程”:
說明:
1)雙擊Threads視窗中相應的行可以看到將要執行下一行語句或線程的當前行,如所示:
2)Threads視窗不一定會將所有任務都顯示出來。
如,所示將斷點打在第13行,只能看到主線程被載入,其他的任務都沒有顯示出來。
多加幾個斷點,如所示:
按F5,如所示:
雙擊中某一條,注意視窗資訊的變化。
4 Call Stack視窗
斷點調試狀態下,按F5或點擊“啟動調試”,然後點擊“調試”——>“視窗”——>“呼叫堆疊”
在Call Stack視窗中,按右鍵,調出菜單。
5 Parallel Stack視窗
斷點調試狀態下,按F5或點擊“啟動調試”,然後點擊“調試”——>“視窗”——>“並行堆棧”
Parallel Stack視窗的左上方 可以切換顯示線程和任務,切換到任務,顯示如下:
說明:
1)節點之間的箭頭表示任務或線程整體的調用路徑,藍色高亮箭頭表示當前任務或線程的路徑。
2)同時調出Parallel Stack和Parallel Task視窗,Parallel Stack設定如:
雙擊Parallel Task中的一條任務,可匹配到Parallel Stack中的任務。
將Parallel Stack切換到線程視圖,藍色的為對應部分。
點擊紅框中的圖表,可得下面的視圖
6 實戰運用
檢測死結
具體程式碼見易錯點分析那部分。
按F5,然後“調試”——>“全部中斷”,可得下面的結果,可以看出兩個任務狀態都為“死結”,雙擊每一條,可定位到相應的任務。
-----------------------------------------------------------------------------------------
轉載與引用請註明出處。
時間倉促,水平有限,如有不當之處,歡迎指正。
.Net多線程編程—使用Visual Studio 2012進行調試