windows下野指針的debug方法
阿新 • • 發佈:2017-10-15
行程 崩潰 方法 指針 斷點 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方法