綠色資源網(wǎng):您身邊最放心的安全下載站! 最新軟件|熱門排行|軟件分類|軟件專題|論壇轉(zhuǎn)帖|廠商大全

綠色資源網(wǎng)

技術(shù)教程
您的位置:首頁電腦醫(yī)院系統(tǒng)故障 → 提示access violation at address解決辦法

提示access violation at address解決辦法

我要評論 2013/08/02 14:28:15 來源:綠色資源網(wǎng) 編輯:sonlywya.cn [ ] 評論:0 點(diǎn)擊:2683次

解決方法:
  右擊“我的電腦”。單擊“屬性”。
  在“系統(tǒng)屬性”中單擊“高級”。
  在“性能”中單擊“設(shè)置”。
  在“性能選項(xiàng)”中單擊“數(shù)據(jù)執(zhí)行保護(hù)”。
  單擊“添加”。選擇要運(yùn)行的程序。
  OK。就這么簡單。

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

Access Violation(非法訪問),General Protection Fault(一般保護(hù)性錯(cuò)誤)或者Invalid Page Fault(無效頁面錯(cuò)誤),雖然說法不一樣,但本質(zhì)上總是由同一種錯(cuò)誤引起的。Access Violation常常在計(jì)算機(jī)用戶運(yùn)行的程序試圖存取未被指定使用的存儲區(qū)時(shí)遇到。
Access violation at address <十六進(jìn)制值>
in module <應(yīng)用程序名>
Read of address <十六進(jìn)制值>
  Windows用戶可能經(jīng)常會看到類似于錯(cuò)誤提示:“Error:Access violation at address 836556F8(004096da). Read of address 836556F8(00401000)”。作為一個(gè)Delphi程序開發(fā)者,遇到這種錯(cuò)誤的機(jī)會比其他用戶更多(^_^)。
  一旦Windows要在它被分配的存儲區(qū)之外寫數(shù)據(jù)信息,它就會覆蓋其他程序甚至操作系統(tǒng)的命令或數(shù)據(jù)。一旦發(fā)生了這種情況,操作系統(tǒng)將會癱瘓或者以某種形式關(guān)閉,你必須重新啟動計(jì)算機(jī)。例如,在Windows NT/2000下一個(gè)程序遇到這種錯(cuò)誤時(shí),Dr. Watson出現(xiàn)并且停止了該程序,捕獲了一些快速的細(xì)節(jié)狀態(tài),再把它們用文本形式記錄下來。Access Violation是某些最令人氣惱的Windows程序遇到的錯(cuò)誤之一。本文的目的就是讓你找到Delphi中Access Violation的解決之道。首先聲明一點(diǎn),Access Violation和Microsoft Access沒有任何關(guān)系。

  用Delphi開發(fā)程序時(shí),我們可以把遇到的Access Violation分成兩大類:運(yùn)行期和設(shè)計(jì)期。

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

1.硬件原因
  在啟動或關(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ū)動線,有些聲卡、顯卡、網(wǎng)卡實(shí)際上也會導(dǎo)致這種錯(cuò)誤。為什么這么說?計(jì)算機(jī)里的每一塊卡都有它的設(shè)備驅(qū)動程序。對于不同的制造商、不同版本的Windows或者不同版本的Delphi都可能會遇到不同的問題。如下的幾個(gè)步驟可能有助于你解決遇到的這些問題:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Access violation通常只在程序的某一個(gè)方面表現(xiàn)出來。當(dāng)問題第一次出現(xiàn)時(shí),考慮一下用戶進(jìn)行了什么操作是很重要的,然后從這里尋找突破口。從用戶的角度來看,你的程序中止了他們的工作,由他們來告訴你出現(xiàn)的問題似乎讓你延期解決這個(gè)問題了。然而,與用戶交流是你發(fā)現(xià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è)沒有被創(chuàng)建的對象。如果第二個(gè)地址<十六進(jìn)制值>是FFFFFFF或0000000,十有八九就是你訪問? 了一個(gè)沒有被建立的對象。例如,你調(diào)用了一個(gè)表單的事件,但這個(gè)表單不是自動創(chuàng)建的,也沒有代碼實(shí)例化。

?procedure TfrMain.OnCreate(Sender: TObject);
var BadForm: TBadForm;
begin
//這里將會產(chǎn)生Access violation
BadForm.Refresh;
end;

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

如果你在Debugger選項(xiàng)窗口使“Stop on Delphi Exceptions”生效,那么就會彈出下面的信息:
The message states that the EAccessViolation has occurred. The EAccessViolation is the exception class for invalid memory access errors.

這是你在設(shè)計(jì)程序時(shí)將會看到的信息,下一個(gè)信息框?qū)霈F(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…”,在對話框里輸入錯(cuò)誤發(fā)生的地址(0043F193)后點(diǎn)擊“OK”按鈕。Delphi將會重新編譯你的工程文件,然后顯示發(fā)生運(yùn)行期錯(cuò)誤的那一行代碼,這里就是BadForm.Refresh這一行了。

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

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

在下面的代碼里,在調(diào)用一個(gè)已經(jīng)被刪除了的對象(b:TBitmap)事件后,一個(gè)Access violation出現(xiàn)了:
var b:TBitmap;
begin
b:=TBitmap.Create;
try
//對b對象進(jìn)行一些操作
finally
b.free;
end;
...
//由于b已經(jīng)被釋放,一個(gè)Access violation錯(cuò)誤將會出現(xiàn)
b.Canvas.TextOut(0,0,’這是一個(gè) Access Violation’); <

關(guān)鍵詞:解決辦法,access,violation

閱讀本文后您有什么感想? 已有 人給出評價(jià)!

  • 14 歡迎喜歡
  • 14 白癡
  • 14 拜托
  • 14 哇
  • 14 加油
  • 14 鄙視