Access Violation


當你運行程式得到了一個AV(Access Violation)錯誤的時候,這意味着你的程式正在試圖訪問一塊不再有效的內存,請注意我所提到的“不再 ”有效。大多數的情況下,出現這個錯誤要么是因為你試圖訪問一塊已經被釋放的內存,要么是想使用一個還未創建對象的指針。

    幸運的是:Win32的內存體系在不同的進程(Process)間使用了獨立的地址空間。所以我們可以不必擔心會訪問到其他的進程中的地址空間而造成破壞,(在Win 16下就有這種潛在的危險).這也就意味着我們能夠正確的利用錯誤對話框中的信息。

    當我們得到一個AV錯誤對話框的時候,將會出現例如:Av at ddress ????的字樣。這個時候把這個地址寫下來(如圖為:0X4006A620),回到程序中並且打開調試用的CPU窗口,右鍵選擇"Goto Address",你將會發現出錯的信息結構。

    當然CPU窗口都是以匯編語言(Assembly)出現的.你可能對此不大熟悉。於是你就可以在窗口中滾動看看到底是哪個函數(funtion)調用了它。這樣你就可以在這個地方設置斷點了(breakpoint).

不幸的是,不是每個錯誤都是這么容易的捕捉到的。相對而言。指針問題是很難調試的。這里有個常規的法則就是:在刪除指針指向的對象以后。請將它置為NULL 。因此在調用的時候你可以先看看這個指針是否為NULL,如果是NULL,你可以在這個地方輸出一些調試信息以方便你在發生AV錯誤的時候能精確的找到這個地方。

    在VC中調試程序時,Output窗口有時會出現“First-chance exception in xxx.exe...”這樣的信息。一般來說,這是由於程序中發生了異常,被VC捕獲而產生的輸出。
  在調試器中運行程序時,如果程序產生異常,調試器會首先獲得通知(即First-chance exception),而后此異常由產生它的程序負責捕獲。如果程序沒有捕獲此異常,那么調試器會再次被通知(即Second-chance exception,Last-chance exception),並結束程序。
 通常見到的“First-chance exception”一般是“0xC0000005: Access Violation”,“0xC00000FD: Stack Overflow”等,這些都說明程序中有缺陷,需要修正。
  但是也有一些屬於正常的情況,例如“First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception”。Windows 操作系統中廣泛使用了結構化異常(SEH)來處理特殊情況,許多和底層打交道的API都靠SEH來處理可能發生的意外。並且,這些API中都有捕獲SEH 的代碼,產生的異常不會對程序造成影響。但是由於上面提到的“First-chance exception,Second-chance exception”機制,VC仍然會有輸出,但是我們完全可以忽略。如果你實在不喜歡這些輸出信息,那你就必須禁用對特定異常的“First- chance exception”捕獲。

    在調試狀態下,打開debug菜單下的exception對話框,把access violation異常的action改成stop always,這時再出現異常,調試器就會彈出一個對話框報告這個異常,並在異常發生處停下來,而不僅僅是在output窗口中報告first- chance exception,這有助於你定位異常位置。

文章轉自:http://blog.csdn.net/xrbeck/archive/2002/06/26/7054.aspx

               http://www.wangchao.net.cn/bbsdetail_73301.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM