AV錯誤常用解決方法四_第1頁
AV錯誤常用解決方法四_第2頁
AV錯誤常用解決方法四_第3頁
AV錯誤常用解決方法四_第4頁
AV錯誤常用解決方法四_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、AV錯誤常用解決方法四 Violation(非法訪問)General rotection Fault(一般保護性錯誤)或者Invalid age Fault(無效頁面錯誤)雖然說法不一樣但本質(zhì)上總是由同一種錯誤引起的。Access Violation常常在計算機用戶運行的程序試圖存取未被指定使用的存儲區(qū)時遇到。 Access violation at address <十六進制值> in module <應(yīng)用程序名> Read of address <十六進制值>Windows用戶可能經(jīng)常會看到類似于錯誤提示:

2、“Error:Access violation at address 836556F8(004096da). Read of address 836556F8(00401000)”。作為一個Delhi程序開發(fā)者遇到這種錯誤的機會比其他用戶更多(_)。一旦Windows要在它被分配的存儲區(qū)之外寫數(shù)據(jù)信息它就會覆蓋其他程序甚至操作系統(tǒng)的命令或數(shù)據(jù)。一旦發(fā)生了這種情況操作系統(tǒng)將會癱瘓或者以某種形式關(guān)閉你必須重新啟動計算機。例如在Windows NT/2000下一個程序遇到這種錯誤時Dr. Watson出現(xiàn)并且停止了該程序捕獲了一些快速的細節(jié)狀態(tài)再把它們用文本形式記錄下來。Access Violati

3、on是某些最令惱的Windows程序遇到的錯誤之一。本文的目的就是讓你找到Delhi中Access Violation的解決之道。首先聲明一點Access Violation和Microsoft Access沒有任何關(guān)系。用Delhi開發(fā)程序時我們可以把遇到的Access Violation分成兩大類:運行期和設(shè)計期。 一、設(shè)計期的Access Violation 1.硬件原因 在啟動或關(guān)閉Delhi IDE以及編譯一個Delhi工程時容易出現(xiàn)設(shè)計期的Access Violation。在你的計算機運行中出現(xiàn)Access Violation信息可能由各種各樣的原因引起包括系統(tǒng)BIOS、操作系統(tǒng)或

4、者是硬件驅(qū)動線有些聲卡、顯卡、卡實際上也會導(dǎo)致這種錯誤。為什么這么說?計算機里的每一塊卡都有它的設(shè)備驅(qū)動程序。對于不同的制造商、不同版本的Windows或者不同版本的Delhi都可能會遇到不同的問題。如下的幾個步驟可能有助于你解決遇到的這些問題: 1. 按照必要的步驟來證實你安裝的驅(qū)動程序之間沒有沖突。 2. 有時降低顯示分辨率可能會使某些古怪的顯卡驅(qū)動程序穩(wěn)定一些。 3. 如果使用雙處理器的主板則保證對每個處理器的修改步驟一樣。 4. 對于計算機上的所有硬件注意使用最新的驅(qū)動程序。 2.軟件原因 盡管Intel的計算機中Windows是最流行的操作系統(tǒng)由于Windows系統(tǒng)天生的脆弱性和BU

5、G應(yīng)用程序的誤操作可能導(dǎo)致操作系統(tǒng)的迅速癱瘓(有時操作系統(tǒng)本身也會莫名其妙的癱瘓)。選擇一個更穩(wěn)定的程序開發(fā)環(huán)境是解決之道如下幾個步驟可以幫助你防止某些Access Violation的發(fā)生: (1)盡管Windows 9X相當(dāng)流行Windows NT/2000 還是從多方面被證實是一個穩(wěn)定得多的環(huán)境幾乎對于所有的Windows代碼平臺而言都是這樣。 (2) 確保對于Windows NT/2000已經(jīng)安裝了最新的service ack。每次安裝完新版的service ack你會發(fā)現(xiàn)機器變得穩(wěn)定了。 (3) 為你使用的各種版本的Delhi裝上當(dāng)前的更新或補?。˙DE、ADO)這是提前預(yù)防錯誤的好

6、辦法。盡量使用最新的Delhi補丁Access Violation錯誤數(shù)量尤其是設(shè)計期的錯誤數(shù)會大大減少。 (4)如果你在IDE中經(jīng)常隨機遇到Access Violation錯誤很有可能是你安裝了一個不好的控件、包或者一個向?qū)皇悄闶褂玫陌姹镜腄elhi所編寫或編譯的。試著一個一個卸載定制的控件(或者包)直到問題被解決然后聯(lián)系控件商關(guān)注這個問題的結(jié)果。 (5) 檢查一下計算機里是否有沒用的東西和程序沖突。奇怪的軟件程序和測試版的產(chǎn)品常常會導(dǎo)致Access Violation錯誤。 (6) 如果系統(tǒng)設(shè)置有錯誤那么Access Violation錯誤可能也會經(jīng)常出現(xiàn)。如果你不停地遇到一個錯誤提示

7、信息一樣的Access Violation記錄下這些細節(jié)然后通知可能導(dǎo)致這個錯誤的軟件制造商。 這些就是我對設(shè)計期Access Violation錯誤的全部建議。 二、運行期的Access Violation Delhi常見的運行期Access Violation錯誤有哪些?如何防止?任何軟件開發(fā)都會遇到這樣的情況:你寫好程序并測試然后到處發(fā)送結(jié)果用戶告訴你它失敗了。你可能考慮用編譯指令$D編譯你的程序Delhi可以建立一個有助于定位Access Violation錯誤的源代碼的鏡像文件。工程選項對話框(roject|Otions|Linker &am; Comiler)讓你指定你所需

8、要的一切。對于單文件debug信息和單的對象代碼一起記錄在unit文件里了。編譯使用這個單的程序時debug信息會增加單文件的大小而且會增加額外的內(nèi)存開銷但是它不會影響最終可執(zhí)行文件的大小和運行速度。包含debug信息和鏡像文件(roject|Otions|Linker)選項的產(chǎn)品只有在$D+ 編譯指令下才會完成行信息。Access violation通常只在程序的某一個方面表現(xiàn)出來。當(dāng)問題第一次出現(xiàn)時考慮一下用戶進行了什么操作是很重要的然后從這里尋找突破口。從用戶的角度來看你的程序中止了他們的工作由他們來告訴你出現(xiàn)的問題似乎讓你延期解決這個問題了。然而與用戶交流是你發(fā)現(xiàn)問題和改善程序的惟一有

9、效方法?,F(xiàn)在你將可以知道在只給你沖突的情況下如何輕松發(fā)現(xiàn)準(zhǔn)確徑、源代碼文件、發(fā)生Access violation錯誤的行: “Search - Find Error”。當(dāng)一個運行期Access violation出現(xiàn)時你的用 戶得到的錯誤信息類似于如下情況: Access violation at address <十六進制值> in module <應(yīng)用程序名> Read of address <十六進制值>如果你的程序在Delhi IDE里包含debug信息編譯你可以定位到導(dǎo)致這個錯誤源代碼這一行。 在De

10、lhi程序中一個最普遍導(dǎo)致Access Violation錯誤的原因是使用了一個沒有被創(chuàng)建的對象。如果第二個<十六進制值>是FFFFFFF或0000000十有八九就是你訪問? 了一個沒有被建立的對象。例如你調(diào)用了一個表單的事件但這個表單不是自動創(chuàng)建的也沒有代碼實例化。?rocedure TfrMain.OnCreate(Sender: TObject); var BadForm: TBadForm; begin /這里將會產(chǎn)生Access violation BadForm.Refresh; end;假設(shè)BadForm在工程選項“Available Forms”窗口

11、列表里這個窗口是需要手工創(chuàng)建和釋放的。在上面的代碼里調(diào)用BadForm窗口的Refresh方法就會導(dǎo)致Access violation。如果你在Debugger選項窗口使“Sto on Delhi Excetions”生效那么就會彈出下面的信息: The message states that the EAccessViolation has occurred. The EAccessViolation is the excetion class for invalid memory access errors. 這是你在設(shè)計程序時將會看到的信息下一個信息框?qū)霈F(xiàn)然后程序失敗了: Acces

12、s violation at address 0043F193 in module roject1.exe Read of address 000000.第一個十六進制數(shù)0043F193是發(fā)生Access violation的編譯代碼(roject1.exe)的運行期錯誤的。在IDE里選擇菜單項“Search|Find Error”在對話框里輸入錯誤發(fā)生的(0043F193)后“OK”按鈕。Delhi將會重新編譯你的工程文件然后顯示發(fā)生運行期錯誤的那一行代碼這里就是BadForm.Refresh這一行了。下面列出了Delhi環(huán)境下導(dǎo)致Access violation錯誤的大部分常見原因。這個列

13、表不是也不可能覆蓋所有可能出現(xiàn)的Access violation的情況。請在論壇上發(fā)送你的Access violation信息大家可以試著一起解決這個問題真正的實際事例一般情況下比列出來的錯誤隱晦得多。1. 調(diào)用一個不存在的對象 如上所述大部分Access violation的合理原因是使用了沒有被創(chuàng)建或者已經(jīng)被釋放的對象。為了防止這種類型的Access violation的發(fā)生請確保你訪問的任何對象都首先被創(chuàng)建了。例如當(dāng)一個Table定位在一個沒有被創(chuàng)建的data module(從auto-crete窗口里移走了)里你可能在窗體的OnCreate事件里打開這個表。在下面的代碼里在調(diào)用一個已經(jīng)

14、被刪除了的對象(b:TBitma)事件后一個Access violation出現(xiàn)了: var b:TBitma; begin b:=TBitma.Create; try /對b對象進行一些操作 finally b.free; end; . /由于b已經(jīng)被釋放一個Access violation錯誤將會出現(xiàn) b.Canvas.TextOut(0,0,這是一個 Access Violation); end;2. 不存在的AI參數(shù) 如果你試圖給Win AI函數(shù)傳遞一個不存在的參數(shù)將會出現(xiàn)一個Access violation錯誤。解決此類Access violation錯誤的最好方法是查閱Win AI

15、幫助看看這個AI函數(shù)調(diào)用的參數(shù)信息以及參數(shù)類型。例如總是保證不給一個緩沖參數(shù)傳遞一個無效指針。3. 讓Delhi釋放 當(dāng)一個對象擁有另一個對象時讓它給你做刪除工作。因為默認情況下所有的窗體(自動創(chuàng)建的)都屬于Alication對象。當(dāng)一個應(yīng)用程序結(jié)束時它釋放了Alication對象也就釋放了所有窗體。例如如果你在程序開始時自動創(chuàng)建了兩個窗體(Form1/Unit1和Form2/Unit2)下面的代碼就會導(dǎo)致Access violation錯誤的出現(xiàn): unit Unit1; . uses unit2; . rocedure TForm1.Call_Form2 begin Form2.ShowM

16、odal; Form2.Free; /Access violation錯誤將會出現(xiàn) Form2.ShowModal; end;4. 殺死異常 永遠不要破壞臨時異常對象(E)處理一個異常會自動釋放異常對象。如果你自己手動釋放了異常對象程序會試圖再次釋放它那么就會出現(xiàn)Access violation錯誤: Zero:=0; try dummy:= 10 / Zero; excet on E: EZeroDivide do MessageDlg(不能用0做除數(shù)!,mtError, mbOK, 0); E.free. /Access violation錯誤將會出現(xiàn) end;5. 檢索一個空字符串 一個空字符串是沒有任何數(shù)據(jù)的。就是說檢索一個空字符串相當(dāng)于訪問一個不存在的對象這將導(dǎo)致Access violation錯誤: var s: string; begin s:=; s1:=a; /Access violation錯誤將會出現(xiàn) end;6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論