VS下C++的除錯方法
阿新 • • 發佈:2018-12-30
1.概述:
- 介紹如何利用VisualStudio的除錯屬性,各類端點的設定,利用pdb與dump檔案來定位崩潰問題
2.除錯工程配置:
- 除錯屬性設定:工程的除錯屬性中,我們可以對除錯的程式目錄及路徑進行設定。
- 命令:通常為執行的EXE程式,例如當我們除錯DLL工程時,我們的除錯程式會設定為載入此DLL的exe程式。
- 工作目錄:通常為除錯程式的執行目錄,當我們的程式需要使用相對路徑的外部資源時就需要使用此引數了,指定一個執行目錄。
- 引數:為指定為命名執行的字串資料。
- 生成後事件:
1:當我們除錯DLL工程的時候我們的除錯命令通常是exe程式,每次完成編譯後我們需要手動將動態庫拷貝到exe所在的目錄中。
2:通過生成後事件我們可以自動完成拷貝動態庫等操作來提高我們的除錯效率。
3:拷貝命令示例
a)命令使用的是windows的cmd命令
b)Copy "a.dll" "c:\demo\"
c)Copy "C:\*.dll" "c:\demo\"
3.基本除錯方法:
- 啟動除錯:
- 1、啟動,通過點選VS工具欄上的除錯按鈕,將程式置入除錯模式(或者按F5)
- 2、停止,啟動除錯後通過點選終止按鈕來停止除錯(或者Shift+F5)
- 3、暫停,如果程式中沒有命中斷點的情況下程式會順序的執行程式碼,在執行過程中我們可以通過暫停按鈕來暫時停止程式碼的執行,程式會停止在當前的執行程式碼行中。點選執行後又會繼續執行。
- 輸出視窗的使用:
- 1、當我們啟動除錯程式之後我們可以使用除錯視窗來獲取程式的執行資訊。
- 2、通過選單-》檢視-》輸出,我們則可以開啟輸出視窗(alt+2)
- 3、啟動除錯後系統會利用輸出視窗反饋程式中所有資源的載入順序和資訊。
- 4、對於有符號DLL,在輸出視窗內將會顯示,“已載入”,表示掛在DLL對應的符號檔案已經完成載入,並觀察載入DLL路徑是否正確。
- 5、此外輸出視窗還可以顯示程式除錯執行過程中的輸出資訊。
- 6、我們可以在程式碼中利用如OutputDebugString這樣的API將文字內容輸出到輸出視窗中顯示以便於我們進行除錯。
- 斷點視窗:
- 1、斷點視窗顯示程式中載入的所有斷點的位置及型別。
- 2、通過選單-》除錯-》視窗-》斷點(Alt+F9),可以開啟斷點視窗,如上圖所示。
- 3、我們可以通過斷點視窗的工具欄按鈕完成以下的操作:
- 刪除所有的斷點或選定斷點
- 禁用啟用所有的斷點或選中斷點,禁用後此斷點不會命中
- 匯出斷點或匯入斷點
- 4、位置斷點的設定:預設情況下我們通過F9鍵產生的斷點型別為位置型別,斷點型別為位置型別,即只要程式碼執行到此位置,即會立即產生命中。
- 5、條件斷點的設定
- 條件斷點的命中條件可以進行配置,如某一個變數為真,或者等於某一特定的數值時進行命中。我們先產生一個斷點,在編輯區左側斷點紅色圓形區域點選右鍵,選擇條件斷點,選擇完畢後,會彈出一個對話方塊,提示我們輸入命中條件。(如右圖所示):
- 6、命中次數斷點的設定:命中次數斷點則可以設定當經過此處固定次數後才進行命中,可供選擇的命中次數條件是:總命中,等於某一次數,大於等於某一次數或者幾倍於某一次數。(如下圖所示)
- 7、篩選器斷點的設定:對特定的執行緒、計算機、程序進行斷點
- 8、命中條件斷點的設定:命中除錯斷點可以在命中此斷點時輸出資訊到輸出視窗,並且可以直接列印輸出變數的資料。
- 9.資料斷點設定:執行時斷點,只能啟動除錯並且在暫停條件下才可以進行設定。當指定的記憶體地址資料發生變化的時候立即進行命中。
- 斷點的除錯:
- 執行依據程式碼,遇到函式不進入函式體內部(按F10);跳出當前的函式(按Shift+F11);逐句除錯執行,遇到函式呼叫後進入函式內部繼續除錯(按F11);在一個堆疊中我們可以通過拖動執行指標來回退程式碼執行位置。
- 堆疊視窗的使用:
- 1、通過斷點我們可以將程式“凍結”在某一個執行時刻,而通過堆疊視窗我們則可以看到程式當前狀態的函式呼叫順序。
- 2、通過VS的選單,“除錯”-》“視窗”-》“呼叫堆疊”或者通過Alt+F7開啟堆疊視窗
- 3、通過在視窗中雙擊函式名稱我們可以切換到對應的呼叫函式位置中。(如下圖所示:灰色表示無程式碼和符號不可能已經定位顯示)
- 自動變數視窗的使用:
- 自動變數視窗中顯示當前堆疊所執行程式碼行中使用的資料內容,當我們切換到下一行程式碼後自動變數視窗中的內容會發生對應的變化。
- 區域性變數視窗的使用:區域性變數視窗顯示當前堆疊函式中所使用變數的內容。
- 執行緒視窗的使用:
- 執行緒視窗顯示當前程式執行緒的執行狀態,在多執行緒程式開發中我們可以通過這個視窗瞭解執行緒的啟動和釋放情況。每個執行緒都有自己獨立的呼叫堆疊和變數堆疊,切換不同的執行緒我們會發現堆疊會發生對應的變化,線上程之前堆資料可以進行共享。黃色箭頭表示的是當前程式碼執行指標所在的執行緒位置,此外我們還可以看到每個執行緒所執行的函式體。
- 模組視窗的使用
- 模組視窗顯示當前程式所載入的所有模組內容。我們主要通過這個視窗來檢視模組是否被正常載入,載入路徑是否正確,並判斷所需要的模組的符號檔案是否已經找到。
- 監視視窗與快速監視視窗的使用
- 在監視視窗中我們可以定義我們所關注的變數,輸入變數的內容我們即可獲取此變數的內容。變數內容超出當前