提示(shì)access violation at address解決辦法(fǎ)
解決(jué)方法:
右擊“我的(de)電(diàn)腦”。單擊“屬性”。
在“係統(tǒng)屬性”中單(dān)擊“高(gāo)級”。
在“性能”中單擊“設置”。
在(zài)“性能選項”中單(dān)擊“數據執行保護”。
單擊“添加”。選擇要運行(háng)的程序。
OK。就這麽簡單(dān)。
Access Violation(非法訪問)錯誤的解(jiě)決方法
Access Violation(非法訪問),General Protection Fault(一般保護性錯誤(wù))或者Invalid Page Fault(無效頁麵(miàn)錯誤),雖然說法不一樣,但本質上總是由同一(yī)種錯誤引起的。Access Violation常常在(zài)計算機用戶運行的程序試(shì)圖存(cún)取未被指(zhǐ)定使用(yòng)的存儲區時(shí)遇到。
Access violation at address <十六進製值>
in module <應用(yòng)程(chéng)序名(míng)>
Read of address <十六(liù)進(jìn)製值>
Windows用戶可能經常會看到類似於錯誤提示:“Error:Access violation at address 836556F8(004096da). Read of address 836556F8(00401000)”。作為一個Delphi程序開發者,遇到這(zhè)種錯誤(wù)的機會比其他(tā)用戶更多(^_^)。
一旦Windows要在它被分配(pèi)的存儲區之外寫數據信息,它就會覆蓋其他程序甚至(zhì)操作(zuò)係(xì)統的(de)命(mìng)令(lìng)或數(shù)據。一旦(dàn)發生了這種(zhǒng)情(qíng)況,操作(zuò)係(xì)統將會癱(tān)瘓或(huò)者以(yǐ)某種形式關閉,你必須重新啟動計算機。例(lì)如,在Windows NT/2000下一(yī)個程序(xù)遇到這種錯誤時(shí),Dr. Watson出現並(bìng)且停止了該(gāi)程序(xù),捕獲了(le)一些快速的細(xì)節狀態(tài),再把(bǎ)它們(men)用文本形(xíng)式記錄(lù)下(xià)來。Access Violation是某些最令人(rén)氣惱的Windows程序(xù)遇到(dào)的錯誤之一。本文的(de)目的就(jiù)是讓你(nǐ)找到(dào)Delphi中Access Violation的解決(jué)之道。首先聲明一點,Access Violation和Microsoft Access沒有任何關係。
用Delphi開發程序時,我們(men)可以把遇到的Access Violation分成兩大類:運行期和設計期(qī)。
一、設計期的(de)Access Violation
1.硬件(jiàn)原因
在啟動或關閉Delphi IDE以及編譯一(yī)個Delphi工程(chéng)時(shí)容易出現設計期的Access Violation。在你(nǐ)的計算機運行中出現Access Violation信息(xī)可能由(yóu)各種各樣的原因引(yǐn)起(qǐ),包括係統Bioses、操(cāo)作係統或者是硬件驅動線,有些聲卡、顯卡、網卡實(shí)際上也(yě)會導(dǎo)致這(zhè)種錯誤(wù)。為(wéi)什麽(me)這麽說?計算機裏的每(měi)一(yī)塊卡都有它(tā)的(de)設備驅動程(chéng)序。對於不同的製造商(shāng)、不同版本的Windows或者不同版本的Delphi都可能會遇(yù)到不同的問(wèn)題。如下的幾個步驟可能有助於你解決遇到的這些問題:
1. 按照必要的步驟來證實你安裝(zhuāng)的驅動程序之間沒(méi)有(yǒu)衝突。
2. 有時(shí)降(jiàng)低顯示(shì)分(fèn)辨率(lǜ)可能會(huì)使某些古怪的顯卡(kǎ)驅動程序(xù)穩定一些。
3. 如果使用雙(shuāng)處理器的主板,則保(bǎo)證(zhèng)對每個處理器的(de)修改步(bù)驟一樣。
4. 對(duì)於計算機上的所有硬件注意使用(yòng)最(zuì)新的驅動程序。
2.軟件原因
盡管Intel的計算機(jī)中(zhōng)Windows是(shì)最(zuì)流行的操作係統,由於Windows係統(tǒng)天生的脆弱性和BUG,應用程序的誤操作可能導(dǎo)致操作係統的迅速癱瘓(有時(shí)操作係統本身(shēn)也會莫名(míng)其妙的癱(tān)瘓)。選擇一個更穩定(dìng)的(de)程序開發環境是解決之道,如下(xià)幾個(gè)步驟可以幫助你防止某些Access Violation的(de)發生:
(1)盡管Windows 9X相當流(liú)行,Windows NT/2000還是(shì)從(cóng)多方麵被證(zhèng)實(shí)是(shì)一個穩定(dìng)得多的環(huán)境,幾乎對於所(suǒ)有(yǒu)的Windows代碼平台而言(yán)都是這樣。
(2) 確保(bǎo)對於Windows NT/2000已經安裝了最新的service pack。每(měi)次安裝完新版的service pack,你會(huì)發現機器變得(dé)穩(wěn)定了。
(3) 為你使用的各種(zhǒng)版本的Delphi裝(zhuāng)上當前的更新或補丁(BDE、ADO……),這是提前預防錯誤的好辦法。盡量使用最新的Delphi補丁——Access Violation錯誤數量尤其是設計(jì)期的錯誤數會大大減少。
(4)如果你在IDE中經(jīng)常隨機遇到Access Violation錯誤,很有(yǒu)可能是你安裝了一個(gè)不好的控件、包或者(zhě)一個向導(dǎo),它不(bú)是你(nǐ)使用的(de)版本的Delphi所編寫或編譯的。試著一(yī)個一個卸載定製的控件(或者包)直到問題被解(jiě)決(jué),然(rán)後聯(lián)係控件廠(chǎng)商關注這個問題的結果。
(5) 檢查一下計算機裏是(shì)否有沒(méi)用的(de)東西和程序衝突。奇怪的軟件程序(xù)和測試版(bǎn)的產品常(cháng)常會導(dǎo)致(zhì)Access Violation錯誤。
(6) 如果係統(tǒng)設置(zhì)有錯誤,那麽Access Violation錯誤可能也會經常出(chū)現。如果你不停地遇到一個錯誤提示信息一樣的Access Violation,記錄下這些(xiē)細節,然後通知可能導(dǎo)致這個錯誤的軟件製造廠(chǎng)商。
這些就是我對設計期Access Violation錯誤的全部(bù)建議。
二(èr)、運(yùn)行期的Access Violation
Delphi常見的運行期(qī)Access Violation錯誤有哪些?如何防止?
任何軟(ruǎn)件開發都會遇(yù)到(dào)這樣的情況:你(nǐ)寫好程序並測試,然後到處發送,結果用戶告訴你它(tā)失(shī)敗(bài)了。
你可能考(kǎo)慮用編譯指令{$D}編譯你(nǐ)的(de)程序——Delphi可以建立(lì)一(yī)個有助於定位Access Violation錯誤的源(yuán)代碼的(de)鏡(jìng)像文件。工程(chéng)選項對(duì)話框(Project|Options|Linker & Compiler)讓你指定你所(suǒ)需要的(de)一切。對於單(dān)元文件(jiàn),debug信息和單元的對象代碼一起(qǐ)記(jì)錄在unit文件裏了。編譯使用這個(gè)單元的程序時(shí),debug信息會增(zēng)加單(dān)元文件的大(dà)小而且會增加額外的內存開銷,但是它不會(huì)影(yǐng)響最終可執行文件(jiàn)的大小(xiǎo)和運行速度。包含debug信息和鏡像文件(Project|Options|Linker)選項的產品隻有在{$D+} 編譯指令下才會完成行信息。
Access violation通常隻在程序的某一個方麵表現出來。當(dāng)問題(tí)第一次出現時,考慮一下用戶進行了什(shí)麽操(cāo)作是很重要的,然後從這裏尋(xún)找突(tū)破口。從用戶的(de)角度來看,你(nǐ)的程序中止了他們的工作,由(yóu)他(tā)們來告訴你出現的問題似乎(hū)讓你延期(qī)解決這(zhè)個問(wèn)題了。然而,與用戶(hù)交流是你發現問題和改善程序的惟一有效方(fāng)法。
現在你將(jiāng)可(kě)以知道在隻(zhī)給你衝突地(dì)址(zhǐ)的情況(kuàng)下,如何輕鬆發現(xiàn)準確路徑、源代碼文件、發生Access violation錯誤的行:
“Search - Find Error…”。
當一個(gè)運行期Access violation出現時,你的用戶得到的(de)錯誤信息(xī)類似(sì)於如下情況:
Access violation at address <十六進製值>
in module <應用程序名>
Read of address <十六進(jìn)製值>
如果你(nǐ)的程序在Delphi IDE裏包含debug信息編(biān)譯,你可以定(dìng)位(wèi)到導致這個(gè)錯誤源代碼這一(yī)行。
在Delphi程序(xù)中,一個最普遍導(dǎo)致Access Violation錯(cuò)誤(wù)的原因是(shì)使用了一(yī)個沒有被創建的對象。如果第(dì)二個地址<十六進製(zhì)值>是FFFFFFF或0000000,十(shí)有八(bā)九就是你訪問? 了一個沒有被建立的對象(xiàng)。例如,你調用了(le)一個表單的事件,但這個表單不是自動創建的,也沒有代碼實例化(huà)。
?procedure TfrMain.OnCreate(Sender: TObject);
var BadForm: TBadForm;
begin
//這裏將(jiāng)會(huì)產生Access violation
BadForm.Refresh;
end;
假設BadForm在工程選(xuǎn)項(xiàng)“Available Forms”窗口列表(biǎo)裏——這個窗口(kǒu)是需要手工創建和釋(shì)放的。在上(shàng)麵(miàn)的代碼裏(lǐ)調用BadForm窗口(kǒu)的Refresh方法就會導致Access violation。
如果你在Debugger選項窗口使“Stop on Delphi Exceptions”生效,那(nà)麽就會(huì)彈出下麵(miàn)的信息:
The message states that the EAccessViolation has occurred. The EAccessViolation is the exception class for invalid memory access errors.
這是(shì)你在設計程序時將會看到的(de)信息,下一個信息框將(jiāng)會出現,然後程序失敗了:
Access violation at address 0043F193
in module ’Project1.exe’
Read of address 000000.
第一個十六進(jìn)製數(shù)0043F193是發生Access violation的編譯(yì)代碼(Project1.exe)的運(yùn)行(háng)期錯誤的地址。在IDE裏(lǐ)選(xuǎn)擇菜單項“Search|Find Error…”,在對(duì)話框裏(lǐ)輸(shū)入(rù)錯誤發生的地址(0043F193)後點(diǎn)擊“OK”按鈕(niǔ)。Delphi將會重(chóng)新編譯(yì)你的工程文件,然後顯示發生運行期錯誤的(de)那一行代碼,這(zhè)裏就是BadForm.Refresh這(zhè)一行了。
下麵列出了(le)Delphi環(huán)境下導致Access violation錯(cuò)誤的大部分常見原因。這個列表不是也(yě)不可能覆蓋所(suǒ)有(yǒu)可能出現的Access violation的情(qíng)況。請(qǐng)在論壇上發送你(nǐ)的Access violation信(xìn)息,大家可以(yǐ)試(shì)著一起解決這個問題——真正(zhèng)的實際事例一般情況下比列出來的錯(cuò)誤隱晦得多。
1. 調用一個不存在的對象
如上所述,大部分Access violation的合(hé)理原因是使用了沒有被創建(jiàn)或者已經被釋放的對(duì)象。為了防止這種類型的Access violation的(de)發生,請確(què)保你訪問的任何對象都首先被創建了。例(lì)如,當一個(gè)Table定位在(zài)一個沒有被創建的data module(從auto-crete窗口裏移走了)裏,你可能在(zài)窗體的OnCreate事(shì)件裏打開這個表。
在(zài)下麵的代碼裏,在調用(yòng)一個已經(jīng)被刪除了的對象(xiàng)(b:TBitmap)事件後,一個(gè)Access violation出(chū)現了:
var b:TBitmap;
begin
b:=TBitmap.Create;
try
//對b對象進行一些操(cāo)作
finally
b.free;
end;
...
//由於b已經被釋放,一個Access violation錯誤將會出(chū)現
b.Canvas.TextOut(0,0,’這是(shì)一個 Access Violation’); <
關鍵詞:解決辦法,access,violation
閱讀本文後您(nín)有什麽感想(xiǎng)? 已有 人給出(chū)評(píng)價!
- 14
- 14
- 14
- 14
- 14
- 14