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