記憶體越界的現象及除錯方法

2021-04-13 10:01:20 字數 831 閱讀 9285

記憶體越界的現象及除錯方法

遇到了好幾回這樣的事的,在這裡總結一下經驗,期待您的豐富

現象: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 死鎖現象及解決方法

摘自 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的...