如何调试栈破坏之类的问题
經常碰到本來運行很正常的程序,忽然彈出錯誤對話框,“ "0X****"指令引用的"0X******"內存。該內存不能為"read"或"written"”。接著程序就崩潰退出。
這樣的錯誤是程序存在BUG引起堆棧被破壞導致的。不要小看這樣的問題,這種導致堆棧破壞的BUG因為不知道下一次什么時候就會出現,
具有很強的隱蔽性。所以調試起來也很麻煩。
現在介紹一個調試辦法:
使用GFlags.exe調試工具設置對進程的內存分配進行監控;一旦內存使用違例,程序會在第一時間崩潰報錯,而不是在清理違例內存現場時才會報錯。
這樣調試時就能立即找到引起堆棧破壞的一行代碼,大大提高了調試此類BUG的效率。
GFlags.exe包含在微軟調試工具包Windbg中.
安裝完Windbg之后,用命令行進入Windbg的安裝目錄(我的是C:\Program Files\Debugging Tools for Windows (x86))
輸入命令 “gflags /p /enable \TbsSearch.exe /full”
我這里調試的是TbsSearch.exe。進程名不需要包含路徑。
點擊回車后,會顯示下面內容:
path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
??? tbssearch.exe: page heap enabled
再次運行你的進程,程序有沒有立馬崩潰了?是不是為你的程序崩潰感到高興啊?
現在你可以直接使用VC開發工具斷點調試查找引起崩潰代碼了。
還有,如果你的進程調用了某個DLL,你懷疑你的DLL也有可能有問題你可以加上“DLLS”選項
如調試TBS工具:gflags /p /disable \***.exe /full /dlls tbsbase-3.1.dll
最后,當你一切調試完之后,別忘了使用Disable命令取消進程的堆棧破壞監控。否則運行你的程序時,會很吃內存的。
gflags /p /disable \***.exe /full
轉載于:https://www.cnblogs.com/terminator-studio/archive/2012/04/13/2445695.html
總結
以上是生活随笔為你收集整理的如何调试栈破坏之类的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中动态引入css样式文件
- 下一篇: Shell编程入门基础上