官术网_书友最值得收藏!

2.2 斷點管理

斷點(breakpoint)在調試技術中最為重要,因此我們首先介紹與斷點相關的技術。

斷點是為了滿足調試的需要而在程序中設置的特殊標志,代碼執行到包含特殊標志的位置時會暫停,我們可以查看或者修改程序運行的一些信息,比如內存信息、堆棧信息等,還可以檢查程序運行的結果,并且據此判斷程序運行是否符合期望等。總而言之,斷點就是程序中斷(暫停運行)的地方。

2.2.1 設置/刪除斷點

在VC系列版本中,從VC6開始,設置斷點的快捷鍵默認為F9,刪除斷點的默認快捷鍵也是F9。也就是說,F9是一個斷點切換鍵,當被按下時,如果光標所在的代碼行沒有設置過斷點,就會在光標處設置一個斷點;如果光標所在的代碼行已經設置過斷點,就會刪除對應的斷點。我們可以在任意代碼位置(甚至是代碼注釋行)設置斷點,但是在啟動調試以后,就只能在有效的代碼行設置斷點。

也可以通過菜單來設置斷點,如圖2-4所示,可以通過菜單“調試”→“切換斷點”在第312行代碼處設置一個斷點。

圖2-4 通過調試菜單設置斷點

用戶可以在程序啟動前提前設置好斷點,也可以在調試過程中隨時設置新的斷點或者刪除斷點。

2.2.2 禁用斷點

對于一個暫時不需要的斷點,可以將其刪除或者禁用。刪除和禁用斷點的區別在于,如果一個斷點被刪除,該斷點就會消失;如果一個斷點被禁用,我們可以對被禁用的斷點繼續操作,比如重新啟用斷點,只是程序代碼運行到被禁用的斷點后并不會暫停下來。我們可以通過以下幾種方式來禁用斷點。

用鼠標右鍵點擊菜單:在斷點處單擊鼠標右鍵,選擇“禁用斷點”命令即可禁用斷點。如圖2-5所示,在第302行代碼對應的斷點處單擊鼠標右鍵并選擇“禁用斷點”命令后,該行的斷點即被禁用。在斷點被禁用后,斷點的圖標會從紅色小圓點變成白色小圓圈。

圖2-5 用鼠標右鍵單擊菜單中的“禁用斷點”命令

組合鍵:禁用斷點和啟用斷點的組合鍵是Ctrl+F9,按下后即可禁用一個啟用的斷點,或者啟用一個已經禁用的斷點。該組合鍵與F9鍵類似,都是進行切換的功能。

2.2.3 查看所有斷點

無論是在調試啟動前還是調試過程中,都可以隨時查看已經設置好的所有斷點。VC提供了一個“斷點”窗口,可以查看所有已經設置好的斷點,如圖2-6所示,通過菜單“調試”→“窗口”→“斷點”,就會打開如圖2-7所示的“斷點”窗口。

圖2-6 打開“斷點”窗口

圖2-7 “斷點”窗口

在“斷點”窗口中,可以很方便地對斷點進行管理,比如刪除某些斷點、禁用/啟用某些斷點。需要說明的是,“斷點”窗口中顯示的是當前解決方案中所有項目的斷點信息,而不是某一個項目的斷點信息。比如,如果當前打開的解決方案中包含10個項目,那么10個項目中的所有斷點都會被顯示出來,如圖2-8所示。

圖2-8 解決方案中的所有斷點

從圖2-8中可以看出,一個斷點的屬性有很多,比如名稱、標簽、條件、進程等。名稱屬性就是源文件的文件名,后面是斷點在該文件中的代碼行號。標簽屬性是對斷點有意義的描述(比如這個斷點的用途),可以用來區分其他斷點。尤其是當同一個文件有多個斷點時,通過“斷點”窗口很難直接看出各個斷點的作用,如果給斷點打一個標簽,取一個有意義的名字,就會一目了然。條件屬性是斷點執行的條件。命中次數指的是在調試過程中,這個斷點命中了多少次。進程屬性指的是當前斷點屬于哪一個進程,只有在調試狀態下才會顯示。“斷點”窗口非常有用,尤其是解決方案中有多個項目的時候,如果兩個項目中的文件名都相同,根據進程屬性就可以判斷斷點屬于哪一個進程。我們來看一個調試狀態下的“斷點”窗口效果,如圖2-9所示。

圖2-9 同時調試多個進程的“斷點”窗口

從圖2-9中我們看到了一類特殊的斷點圖標,它既不是紅色小圓點,也不是白色小圓圈,而是白色小圓圈外加一個驚嘆號。這說明該斷點不是啟用狀態,也不是禁用狀態。這種圖標表示該斷點不會被命中,因為源代碼所對應的調試符號沒有被加載。調試符號在兩種情況下不會被加載,一種是該斷點對應的程序不處于調試狀態,比如圖2-9中標簽為“test”的斷點,它對應的程序是section_8.exe,但是section_8.exe并沒有被調試,所以顯示該圖標;另外一種情況是雖然斷點對應的程序已經啟動,而且處于調試狀態,但是由于各種原因(比如版本不匹配)沒有辦法成功加載,也會顯示該圖標。另外我們也看到了幾個添加了標簽屬性的斷點,比如有一個標簽為“死鎖調試”,則可以判斷該斷點的用途是調試死鎖,可能是這個程序在某些情況下會發生死鎖。進程屬性顯示了兩個進程:chapter_2.exe和section_4.exe。這表示我們當前正在調試這兩個進程,而且這兩個進程都設置了斷點。

后面的調試實踐過程中還會涉及更多的斷點細節,例如條件斷點如何設置、什么是函數斷點等,之后會有專門的章節來介紹相關知識。

主站蜘蛛池模板: 朝阳市| 大渡口区| 绥芬河市| 天长市| 崇信县| 阳信县| 公安县| 措勤县| 芮城县| 蒙城县| 于都县| 岑溪市| 河池市| 怀化市| 桂东县| 穆棱市| 浦县| 宁津县| 临邑县| 兴安盟| 临夏市| 德兴市| 灵丘县| 银川市| 武宣县| 兴城市| 泸西县| 郎溪县| 田阳县| 阜城县| 灵山县| 三都| 衡阳市| 碌曲县| 宿迁市| 西城区| 金秀| 连江县| 昭觉县| 柳林县| 枞阳县|