記憶體越界的現象及除錯方法
遇到了好幾回這樣的事的,在這裡總結一下經驗,期待您的豐富
現象:1 程式出現異常 異常的現象有很多,如:**突然跑到不相干的地方去執行,訪問異常,正常的變數操作也報錯...
原因:**段紊亂,this指標被改變,指標指向的資料被改變
2 程式按邏輯執行,但資料錯誤 如:變數內容突然消失
原因:變數所在空間被其它操作誤刪除等
3 其它莫名其妙的錯誤
原因:越界的基本比較原因,如
1 寫越界: 向10個位元組的陣列寫入了20個位元組;記憶體操作越界,如char sztext[10];memset(sztext,0,30);
2 錯誤的函式呼叫: sprintf等fmt中的預定義和實際輸入的變數數不一致,如sprintf(szdata,"name:%d title:%s",1)
3 錯誤的呼叫方式: 用stdcall 的函式指標 呼叫pascall的函式
檢查方法:
1 boundchecker進行除錯,boundchecker在**編譯時加入了大量的附加處理,其中包括記憶體堆疊檢測等,其實ms的debug模式也做了許多的類似操作,但debug模式下的一些**行為,如初始化變數,和release下的**執行不同,所以用debug除錯不是完美的方式
2 類內部出現莫名其妙的錯誤時,檢視 this 指標是否變化,方法是在除錯的 "檢視" 視窗 輸入:this ;必要的時候進行手手工檢查
3 在除錯的 "檢視" 視窗 輸入:@err,hr 看全域性錯誤變數的內容,也許有提示
4 注釋掉部分**,看是否錯誤還出現,注釋的最佳方式是:二分法
5 檢視程式異常處的反彙編**,分析原因
strcat的記憶體越界陷阱
一下 段裡,char szplanchange 500 未初始化,會導致在strncat進行字串連線的時候因為沒有在字元陣列範圍內找到字串結束符 0 而出現記憶體操作越界的問題。乙個實際的結果是導致delete pstarttime 的時候失敗,為區域性指標變數pstarttime 的位址已經被st...
死鎖現象及解決方法
死鎖現象 過多的同步可能造成相互不釋放資源 先定義兩個類,乙個口紅,乙個鏡子 class lipstick class mirror 化妝類 g0在鎖lipstick後又想鎖住mirror,g1在鎖住mirror後又想鎖住lipstick,當兩個同時都想擁有對方的鎖的時候,就會出現死鎖的現象。pub...
java 死鎖現象及解決方法
摘自 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的...