VS2008——调试方法大全
?
一、【斷點調試】
總結以下VS2008的調試方法,首先最常用的就是使用斷點了,斷點分為兩種:普通斷點、跟蹤點
普通斷點就是紅色圓點,跟蹤點是紅色菱形。可以通過右鍵設置斷點相關內容,讓斷點有更多功能。
條件:設置表達式,只有表達式為true或者已更改才暫停
命中條件:設置命中斷點時的操作,通常用于打印消息,也可以執行宏,以及設置是否暫停
程序在運行到普通斷點的位置后,會停止運行,然后可以通過以下窗口查看想要的信息。
自動窗口:顯示斷點行以及運行的上一行代碼所使用的變量和對應的值,可以修改值
局部變量:顯示斷點行所在的函數中創建的所有局部變量,包括還沒執行到的
監視:可以設置想要查看和修改的變量
普通斷點的命中條件設置為不暫停就變成了跟蹤點,跟蹤點沒有自動窗口、局部變量、監視窗口的功能,但是可以通過命中條件中打印消息來查看值
二、【動態內存調試】
1.使用crtdbg.h頭文件中的相關例程,來檢測是否有內存問題。常用的是1個結構體和5個函數。
_CrtMemState:存儲內存狀態的結構體
void?_CrtMemCheckpoint(_CrtMemState * _State):存儲自由存儲器狀態到結構體中
int _CrtMemDifference(_CrtMemState * _State, const _CrtMemState * _OldState, const _CrtMemState * _NewState):比較新狀態和舊狀態的差別,差別結果存儲在結構中,如果狀態不同,返回非零值,否則返回0
void _CrtMemDumpStatistics(const _CrtMemState * _State):將自由存儲器狀態有關信息轉存到輸出流中,實參指向的狀態結構可以是CheckPoint函數記錄的狀態,也可以是Difference函數產生的差別
void _CrtMemDumpAllObjectsSince(const _CrtMemState * _State):存儲自實參指定的狀態以來,在自由存儲器分配的對象信息,如果傳遞空指針,將存儲自程序開始執行以來,所有已分配對象的信息
int _CrtDumpMemoryLeaks():檢查內存泄漏情況,并轉存檢測結果,可以啟用機制讓函數在程序結束時自動調用,自動檢測程序執行過程有無內存泄漏
2.通過設置int類型標志_crtDbgFlag,可以控制自由存儲器的調試操作,這個標志有5個獨立控制位
// 以下是源代碼定義// 為1,啟用調試地址分配的功能,跟蹤自由存儲器狀態 #define _CRTDBG_ALLOC_MEM_DF 0x01// 為1,阻止delete運算符釋放被分配的內存,可以確定低內存條件下會發生什么事情 #define _CRTDBG_DELAY_FREE_MEM_DF 0x02// 使每次使用new和delete分配內存時都調用_CrtCheckMemory()函數,驗證自由存儲器完整性 // 比如檢查有沒有存儲超出數組范圍的數值而被重寫的內存塊,發現的缺陷會輸出報告 #define _CRTDBG_CHECK_ALWAYS_DF 0x04// 調試操作將跟蹤在內部由運行庫使用的內存 #define _CRTDBG_CHECK_CRT_DF 0x10// 在程序退出時自動調用_CrtDumpMemoryLeaks()執行內存泄漏檢查 // 只有程序沒有釋放所有先前分配的內存時,才能得到輸出 #define _CRTDBG_LEAK_CHECK_DF 0x20默認情況下,_CRTDBG_ALLOC_MEM_DF位是1,其他位都是0,想要設置_crtDbgFlag標志位,需要使用_CrtSetDbgFlag()函數傳遞標志位組合的int,該函數返回之前的狀態。
// 該函數用于設置flag int _CrtSetDbgFlag(int _NewFlag);// 獲取當前flag int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); // 組合標志位 flag |= _CRTDBG_LEAK_CHECK_DF; // 關閉標志位 flag &= ~_CRTDBG_CHECK_CRT_DF; _CrtSetDbgFlag(flag);// 另一種設置方法 _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);3.自由存儲器調試的輸出
輸出目的地默認是調試消息窗口,如果希望在stdout上,則要通過兩個函數設置
// 設置輸出的一般目的地,返回當前模式 int _CrtSetReportMode(int _ReportType, int _ReportMode );// 當reportMode設置為指定流后,指定一個流目的地,返回當前目的地 _HFILE _CrtSetReportFile(int _ReportType, _HFILE _ReportFile); // reportType定義 // 各種警告消息,檢測到內存泄漏的輸出就是警告 #define _CRT_WARN 0 // 不可恢復問題的災難性錯誤消息 #define _CRT_ERROR 1 // 來自斷言的輸出(不是assert()函數手動的輸出) #define _CRT_ASSERT 2// reportMode定義 // 輸出到定向的某個輸出流 #define _CRTDBG_MODE_FILE 0x1 // 默認模式,輸出到調試窗口 #define _CRTDBG_MODE_DEBUG 0x2 // 輸出到消息框 #define _CRTDBG_MODE_WNDW 0x4 // 函數不做設置模式處理,只返回當前reportMode #define _CRTDBG_REPORT_MODE -1// reportFile定義,可以是_HFILE類型文件流的指針,也可以是下列標識符 // 標準輸出流stdout #define _CRTDBG_FILE_STDOUT ((_HFILE)-4) // 標準錯誤流stderr #define _CRTDBG_FILE_STDERR ((_HFILE)-5) // 只返回當前目的地 #define _CRTDBG_REPORT_FILE ((_HFILE)-6) // 可以放在程序任意會執行的位置,常放在程序運行開始位置,可以檢測內存泄漏 _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);內存泄漏檢測要看最后的泄漏對象,因為檢測最后出來的對象是最先創建的,這個最先創建的可能才是泄漏的核心原因。
總結
以上是生活随笔為你收集整理的VS2008——调试方法大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux more命令:查看文件
- 下一篇: 计算机网络的局限性的表现,计算机网络系统