1. 程式人生 > >windows下野指針的debug方法

windows下野指針的debug方法

行程 崩潰 方法 指針 斷點 exe 聲明 enable ons

項目中,出現莫名其妙的崩潰,錯誤為:

xxxx modified at xxxafter it was freed

斷點位置在一個析構函數中,而經過檢查,這個類沒有問題,並不是析構已經被析構的類。

痛苦之下,搜索了一個工具:gfrag.exe

調用:./gflags.exe -p /enable 程序名.exe /full 此處不需要指定具體路徑。

這個工具其實只是設置了註冊表,將:

計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\程序名.exe中設置一個

GlobalFlag REG_SZ 0x02000000

PageHeapFlags REG_SZ 0x3

因此也可以自己手設。shell在運行程序時,會用完全頁堆來進行程序內存分配,這樣的內存,當發生野指針訪問或越界訪問時會產生異常。

如果不設置這個,野指針訪問和越界訪問不會產生異常,於是就不會當場崩潰,而是在下一個free或malloc調用中崩潰,讓人無從查起。

接下來非常順利地發現了問題:一個變量類型變了,但代碼中聲明的指針還是舊的,調用了不同的類的函數,於是查找了超出範圍的內存。

windows下野指針的debug方法