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