最近更新|軟件分類|單機(jī)游戲|軟件專題|手機(jī)版|軟件發(fā)布 access violation at address的解決方法
首頁(yè)>電腦百科>access violation at address的解決方法

access violation at address的解決方法

我要評(píng)論2015/04/30 18:21:58來(lái)源:9553編輯:

當(dāng)我們打開(kāi)一個(gè)程序的時(shí)候,突然提示:access violation at address xxxxxxxxx 后邊一大堆,這種情況下應(yīng)該怎么解決呢?百度了一下,原來(lái)很簡(jiǎn)單,接下來(lái)和小編一起來(lái)看看吧!

出現(xiàn)access violation at address……也是醉了。

access violation at address的解決方法

解決方法

我們需要先右擊我的電腦,單擊,屬性。

access violation at address的解決方法

在“系統(tǒng)屬性”中單擊,高級(jí)。

access violation at address的解決方法

在“性能”中單擊,設(shè)置。

access violation at address的解決方法

在“性能選項(xiàng)”中單擊,數(shù)據(jù)執(zhí)行保護(hù)。

access violation at address的解決方法

單擊“添加”。選擇要運(yùn)行的程序。

access violation at address的解決方法

點(diǎn)擊,確定。這樣就解決問(wèn)題了。

access violation at address的解決方法

重啟電腦,再次打開(kāi)那個(gè)程序就可以了。

Access Violation(非法訪問(wèn))錯(cuò)誤的解決方法

Access Violation(非法訪問(wèn)),General Protection Fault(一般保護(hù)性錯(cuò)誤)或者Invalid Page Fault(無(wú)效頁(yè)面錯(cuò)誤),雖然說(shuō)法不一樣,但本質(zhì)上總是由同一種錯(cuò)誤引起的。Access Violation常常在計(jì)算機(jī)用戶運(yùn)行的程序試圖存取未被指定使用的存儲(chǔ)區(qū)時(shí)遇到。

Access violation at address <十六進(jìn)制值>

in module <應(yīng)用程序名>

Read of address <十六進(jìn)制值>

Windows用戶可能經(jīng)常會(huì)看到類似于錯(cuò)誤提示:“Error:Access violation at address 836556F8(004096da). Read of address 836556F8(00401000)”。作為一個(gè)Delphi程序開(kāi)發(fā)者,遇到這種錯(cuò)誤的機(jī)會(huì)比其他用戶更多(^_^)。

一旦Windows要在它被分配的存儲(chǔ)區(qū)之外寫數(shù)據(jù)信息,它就會(huì)覆蓋其他程序甚至操作系統(tǒng)的命令或數(shù)據(jù)。一旦發(fā)生了這種情況,操作系統(tǒng)將會(huì)癱瘓或者以某種形式關(guān)閉,你必須重新啟動(dòng)計(jì)算機(jī)。例如,在Windows NT/2000下一個(gè)程序遇到這種錯(cuò)誤時(shí),Dr. Watson出現(xiàn)并且停止了該程序,捕獲了一些快速的細(xì)節(jié)狀態(tài),再把它們用文本形式記錄下來(lái)。Access Violation是某些最令人氣惱的Windows程序遇到的錯(cuò)誤之一。本文的目的就是讓你找到Delphi中Access Violation的解決之道。首先聲明一點(diǎn),Access Violation和Microsoft Access沒(méi)有任何關(guān)系。

用Delphi開(kāi)發(fā)程序時(shí),我們可以把遇到的Access Violation分成兩大類:

運(yùn)行期和設(shè)計(jì)期。

一、設(shè)計(jì)期的Access Violation

1.硬件原因

在啟動(dòng)或關(guān)閉Delphi IDE以及編譯一個(gè)Delphi工程時(shí)容易出現(xiàn)設(shè)計(jì)期的Access Violation。在你的計(jì)算機(jī)運(yùn)行中出現(xiàn)Access Violation信息可能由各種各樣的原因引起,包括系統(tǒng)BIOS、操作系統(tǒng)或者是硬件驅(qū)動(dòng)線,有些聲卡、顯卡、網(wǎng)卡實(shí)際上也會(huì)導(dǎo)致這種錯(cuò)誤。為什么這么說(shuō)?計(jì)算機(jī)里的每一塊卡都有它的設(shè)備驅(qū)動(dòng)程序。對(duì)于不同的制造商、不同版本的Windows或者不同版本的Delphi都可能會(huì)遇到不同的問(wèn)題。如下的幾個(gè)步驟可能有助于你解決遇到的這些問(wèn)題:

1. 按照必要的步驟來(lái)證實(shí)你安裝的驅(qū)動(dòng)程序之間沒(méi)有沖突。

2. 有時(shí)降低顯示分辨率可能會(huì)使某些古怪的顯卡驅(qū)動(dòng)程序穩(wěn)定一些。

3. 如果使用雙處理器的主板,則保證對(duì)每個(gè)處理器的修改步驟一樣。

4. 對(duì)于計(jì)算機(jī)上的所有硬件注意使用最新的驅(qū)動(dòng)程序。

2.軟件原因

盡管Intel的計(jì)算機(jī)中Windows是最流行的操作系統(tǒng),由于Windows系統(tǒng)天生的脆弱性和BUG,應(yīng)用程序的誤操作可能導(dǎo)致操作系統(tǒng)的迅速癱瘓(有時(shí)操作系統(tǒng)本身也會(huì)莫名其妙的癱瘓)。選擇一個(gè)更穩(wěn)定的程序開(kāi)發(fā)環(huán)境是解決之道,如下幾個(gè)步驟可以幫助你防止某些Access Violation的發(fā)生:

(1)盡管Windows 9X相當(dāng)流行,Windows NT/2000還是從多方面被證實(shí)是一個(gè)穩(wěn)定得多的環(huán)境,幾乎對(duì)于所有的Windows代碼平臺(tái)而言都是這樣。

(2) 確保對(duì)于Windows NT/2000已經(jīng)安裝了最新的service pack。每次安裝完新版的service pack,你會(huì)發(fā)現(xiàn)機(jī)器變得穩(wěn)定了。

(3) 為你使用的各種版本的Delphi裝上當(dāng)前的更新或補(bǔ)丁(BDE、ADO……),這是提前預(yù)防錯(cuò)誤的好辦法。盡量使用最新的Delphi補(bǔ)丁——Access Violation錯(cuò)誤數(shù)量尤其是設(shè)計(jì)期的錯(cuò)誤數(shù)會(huì)大大減少。

(4)如果你在IDE中經(jīng)常隨機(jī)遇到Access Violation錯(cuò)誤,很有可能是你安裝了一個(gè)不好的控件、包或者一個(gè)向?qū)В皇悄闶褂玫陌姹镜腄elphi所編寫或編譯的。試著一個(gè)一個(gè)卸載定制的控件(或者包)直到問(wèn)題被解決,然后聯(lián)系控件廠商關(guān)注這個(gè)問(wèn)題的結(jié)果。

(5) 檢查一下計(jì)算機(jī)里是否有沒(méi)用的東西和程序沖突。奇怪的軟件程序和測(cè)試版的產(chǎn)品常常會(huì)導(dǎo)致Access Violation錯(cuò)誤。

(6) 如果系統(tǒng)設(shè)置有錯(cuò)誤,那么Access Violation錯(cuò)誤可能也會(huì)經(jīng)常出現(xiàn)。如果你不停地遇到一個(gè)錯(cuò)誤提示信息一樣的Access Violation,記錄下這些細(xì)節(jié),然后通知可能導(dǎo)致這個(gè)錯(cuò)誤的軟件制造廠商。

這些就是我對(duì)設(shè)計(jì)期Access Violation錯(cuò)誤的全部建議。

二、運(yùn)行期的Access Violation

Delphi常見(jiàn)的運(yùn)行期Access Violation錯(cuò)誤有哪些?如何防止?

任何軟件開(kāi)發(fā)都會(huì)遇到這樣的情況:你寫好程序并測(cè)試,然后到處發(fā)送,結(jié)果用戶告訴你它失敗了。

你可能考慮用編譯指令{$D}編譯你的程序——Delphi可以建立一個(gè)有助于定位Access Violation錯(cuò)誤的源代碼的鏡像文件。工程選項(xiàng)對(duì)話框(Project|Options|Linker & Compiler)讓你指定你所需要的一切。對(duì)于單元文件,debug信息和單元的對(duì)象代碼一起記錄在unit文件里了。編譯使用這個(gè)單元的程序時(shí),debug信息會(huì)增加單元文件的大小而且會(huì)增加額外的內(nèi)存開(kāi)銷,但是它不會(huì)影響最終可執(zhí)行文件的大小和運(yùn)行速度。包含debug信息和鏡像文件(Project|Options|Linker)選項(xiàng)的產(chǎn)品只有在{$D+} 編譯指令下才會(huì)完成行信息。

Access violation通常只在程序的某一個(gè)方面表現(xiàn)出來(lái)。當(dāng)問(wèn)題第一次出現(xiàn)時(shí),考慮一下用戶進(jìn)行了什么操作是很重要的,然后從這里尋找突破口。從用戶的角度來(lái)看,你的程序中止了他們的工作,由他們來(lái)告訴你出現(xiàn)的問(wèn)題似乎讓你延期解決這個(gè)問(wèn)題了。然而,與用戶交流是你發(fā)現(xiàn)問(wèn)題和改善程序的惟一有效方法。

現(xiàn)在你將可以知道在只給你沖突地址的情況下,如何輕松發(fā)現(xiàn)準(zhǔn)確路徑、源代碼文件、發(fā)生Access violation錯(cuò)誤的行:

“Search - Find Error…”。

當(dāng)一個(gè)運(yùn)行期Access violation出現(xiàn)時(shí),你的用戶得到的錯(cuò)誤信息類似于如下情況:

Access violation at address <十六進(jìn)制值>

in module <應(yīng)用程序名>

Read of address <十六進(jìn)制值>

如果你的程序在Delphi IDE里包含debug信息編譯,你可以定位到導(dǎo)致這個(gè)錯(cuò)誤源代碼這一行。

在Delphi程序中,一個(gè)最普遍導(dǎo)致Access Violation錯(cuò)誤的原因是使用了一個(gè)沒(méi)有被創(chuàng)建的對(duì)象。如果第二個(gè)地址<十六進(jìn)制值>是FFFFFFF或0000000,十有八九就是你訪問(wèn)? 了一個(gè)沒(méi)有被建立的對(duì)象。例如,你調(diào)用了一個(gè)表單的事件,但這個(gè)表單不是自動(dòng)創(chuàng)建的,也沒(méi)有代碼實(shí)例化。

?procedure TfrMain.OnCreate(Sender: TObject);

var BadForm: TBadForm;

begin

//這里將會(huì)產(chǎn)生Access violation

BadForm.Refresh;

end;

假設(shè)BadForm在工程選項(xiàng)“Available Forms”窗口列表里——這個(gè)窗口是需要手工創(chuàng)建和釋放的。在上面的代碼里調(diào)用BadForm窗口的Refresh方法就會(huì)導(dǎo)致Access violation。

如果你在Debugger選項(xiàng)窗口使“Stop on Delphi Exceptions”生效,那么就會(huì)彈出下面的信息:

The message states that the EAccessViolation has occurred. The EAccessViolation is the exception class for invalid memory access errors.

這是你在設(shè)計(jì)程序時(shí)將會(huì)看到的信息,下一個(gè)信息框?qū)?huì)出現(xiàn),然后程序失敗了:

Access violation at address 0043F193

in module ’Project1.exe’

Read of address 000000.

第一個(gè)十六進(jìn)制數(shù)0043F193是發(fā)生Access violation的編譯代碼(Project1.exe)的運(yùn)行期錯(cuò)誤的地址。在IDE里選擇菜單項(xiàng)“Search|Find Error…”,在對(duì)話框里輸入錯(cuò)誤發(fā)生的地址(0043F193)后點(diǎn)擊“OK”按鈕。Delphi將會(huì)重新編譯你的工程文件,然后顯示發(fā)生運(yùn)行期錯(cuò)誤的那一行代碼,這里就是BadForm.Refresh這一行了。

下面列出了Delphi環(huán)境下導(dǎo)致Access violation錯(cuò)誤的大部分常見(jiàn)原因。這個(gè)列表不是也不可能覆蓋所有可能出現(xiàn)的Access violation的情況。請(qǐng)?jiān)谡搲习l(fā)送你的Access violation信息,大家可以試著一起解決這個(gè)問(wèn)題——真正的實(shí)際事例一般情況下比列出來(lái)的錯(cuò)誤隱晦得多。

1. 調(diào)用一個(gè)不存在的對(duì)象

如上所述,大部分Access violation的合理原因是使用了沒(méi)有被創(chuàng)建或者已經(jīng)被釋放的對(duì)象。為了防止這種類型的Access violation的發(fā)生,請(qǐng)確保你訪問(wèn)的任何對(duì)象都首先被創(chuàng)建了。例如,當(dāng)一個(gè)Table定位在一個(gè)沒(méi)有被創(chuàng)建的data module(從auto-crete窗口里移走了)里,你可能在窗體的OnCreate事件里打開(kāi)這個(gè)表。

在下面的代碼里,在調(diào)用一個(gè)已經(jīng)被刪除了的對(duì)象(b:TBitmap)事件后,一個(gè)Access violation出現(xiàn)了:

var b:TBitmap;

begin

b:=TBitmap.Create;

try

//對(duì)b對(duì)象進(jìn)行一些操作

finally

b.free;

end;

...

//由于b已經(jīng)被釋放,一個(gè)Access violation錯(cuò)誤將會(huì)出現(xiàn)

b.Canvas.TextOut(0,0,’這是一個(gè) Access Violation’);

end;

2. 不存在的API參數(shù)

如果你試圖給Win API函數(shù)傳遞一個(gè)不存在的參數(shù)將會(huì)出現(xiàn)一個(gè)Access violation錯(cuò)誤。解決此類Access violation錯(cuò)誤的最好方法是查閱Win API幫助,看看這個(gè)API函數(shù)調(diào)用的參數(shù)信息以及參數(shù)類型。例如,總是保證不給一個(gè)緩沖參數(shù)傳遞一個(gè)無(wú)效指針。

3. 讓Delphi釋放

當(dāng)一個(gè)對(duì)象擁有另一個(gè)對(duì)象時(shí),讓它給你做刪除工作。因?yàn)槟J(rèn)情況下,所有的窗體(自動(dòng)創(chuàng)建的)都屬于Application對(duì)象。當(dāng)一個(gè)應(yīng)用程序結(jié)束時(shí),它釋放了Application對(duì)象,也就釋放了所有窗體。例如,如果你在程序開(kāi)始時(shí)自動(dòng)創(chuàng)建了兩個(gè)窗體(Form1/Unit1和Form2/Unit2),下面的代碼就會(huì)導(dǎo)致Access violation錯(cuò)誤的出現(xiàn):

unit Unit1;

...

uses unit2;

...

procedure TForm1.Call_Form2

begin

Form2.ShowModal;

Form2.Free;

//Access violation錯(cuò)誤將會(huì)出現(xiàn)

Form2.ShowModal;

end;

4. 殺死異常

永遠(yuǎn)不要破壞臨時(shí)異常對(duì)象(E),處理一個(gè)異常會(huì)自動(dòng)釋放異常對(duì)象。如果你自己手動(dòng)釋放了異常對(duì)象,程序會(huì)試圖再次釋放它,那么就會(huì)出現(xiàn)Access violation錯(cuò)誤:

Zero:=0;

try

dummy:= 10 / Zero;

except

on E: EZeroDivide do

MessageDlg(’不能用0做除數(shù)!’,mtError, [mbOK], 0);

E.free. ////Access violation錯(cuò)誤將會(huì)出現(xiàn)

end;

5. 檢索一個(gè)空字符串

一個(gè)空字符串是沒(méi)有任何數(shù)據(jù)的。就是說(shuō),檢索一個(gè)空字符串相當(dāng)于訪問(wèn)一個(gè)不存在的對(duì)象,這將導(dǎo)致Access violation錯(cuò)誤:

var s: string;

begin

s:=’’;

s[1]:=’a’;

//Access violation錯(cuò)誤將會(huì)出現(xiàn)

end;

6. 直接引用指針

你必須間接引用指針,否則你會(huì)改變指針地址并可能會(huì)破壞其他存儲(chǔ)單元 :

procedure TForm1.Button1Click(Sender: TObject);

var

p1 : pointer;

p2 : pointer;

begin

GetMem(p1, 128);

GetMem(p2, 128);

//下一行導(dǎo)致Access violation錯(cuò)誤

Move(p1, p2, 128);

//下一行方法正確

Move(p1^, p2^, 128);

FreeMem(p1, 128);

FreeMem(p2, 128);

end;

這些就是我對(duì)運(yùn)行期Access Violation錯(cuò)誤的全部建議,我希望你們也能對(duì)你們程序出現(xiàn)的Access Violation錯(cuò)誤提出一些看法。

關(guān)鍵詞: access violation at address