一種Windows下懶式探測(cè)野指針的方法
一種Windows下探測(cè)野指針的方法
在一個(gè)大型項(xiàng)目中遇到了crt報(bào)告HEAP: Free Heap block XXXXXXXX modified at YYYYYYYY after it was freed。
原因很明確:野指針,但是因?yàn)轫?xiàng)目里大量使用了智能指針,因此要定位問題就略頭痛了。
最初是準(zhǔn)備在程序運(yùn)行時(shí)建立內(nèi)存斷點(diǎn)以監(jiān)視所有對(duì)YYYYYYYY的寫操作。但是剛開始運(yùn)行的時(shí)候YYYYYYYY是不能訪問的。
于是準(zhǔn)備重載new 操作以在該內(nèi)存塊能訪問的時(shí)候下斷點(diǎn),然而對(duì)于一個(gè)要反復(fù)分配內(nèi)存的程序,手工監(jiān)視某個(gè)頁是否可以訪問實(shí)在太麻煩了,根本沒有可操作性。于是我在new里面加了如下代碼:
{
?static BOOL bMark=FALSE;
?__try
?{
??if(!bMark)
??{
???int i=*((PUINT8)(/*出錯(cuò)地址*/);
???_ASSERT(FALSE);
??}
??bMark=TRUE;
?}
?__except(1)
?{
?}
}
每次new操作之后都試圖訪問YYYYYYYY,如果不能訪問,則進(jìn)入異常處理部分直接忽略_ASSERT()及后面的代碼,繼續(xù)運(yùn)行。如果可以訪問,那么_ASSERT()會(huì)觸發(fā)一個(gè)斷點(diǎn)。此時(shí)可以手動(dòng)在YYYYYYYY處設(shè)置內(nèi)存斷點(diǎn),同時(shí)自動(dòng)將bMark設(shè)置為TRUE,后面再執(zhí)行到此的時(shí)候就不會(huì)停下來。如此只需要一次手動(dòng)操作即可達(dá)成設(shè)置斷點(diǎn)的效果。
實(shí)在是懶出了風(fēng)格之舉。 :-D





