內存不能read written常見原因

內存不能read written常見原因


使用Windows操作係統的人有時會遇到這樣的錯誤信息:“0X????????指令引用的0x00000000內存,該內存不能written”,然後應用程序被關閉。如果去請教一些“高手”,得到的回答往往是“Windows就是這樣不穩定”之類的義憤和不屑。其實,這個錯誤並不一定是Windows不穩定造成的。本文就來簡單分析這種錯誤的常見原因。

一、應用程序沒有檢查內存分配失敗
程序需要一塊內存用以保存數據時,就需要調用操作係統提供的“功能函數”來申請,如果內存分配成功,函數就會將所新開辟的內存區地址返回給應用程序,應用程序就可以通過這個地址使用這塊內存。這就是“動態內存分配”,內存地址也就是編程中的“指針”。
內存不是永遠都招之即來、用之不盡的,有時候內存分配也會失敗。當分配失敗時係統函數會返回一個0值,這時返回值“0”已不表示新啟用的指針,而是係統向應用程序發出的一個通知,告知出現了錯誤。作為應用程序,在每一次申請內存後都應該檢查返回值是否為0,如果是,則意味著出現了故障,應該采取一些措施挽救,這就增強了程序的“健壯性”。
若應用程序沒有檢查這個錯誤,它就會按照“思維慣性”認為這個值是給它分配的可用指針,繼續在之後的運行中使用這塊內存。真正的0地址內存區保存的是計算機係統中最重要的“中斷描述符表”,絕對不允許應用程序使用。在沒有保護機製的操作係統下(如DOS),寫數據到這個地址會導致立即死機,而在健壯的操作係統中,如Windows等,這個操作會馬上被係統的保護機製捕獲,其結果就是由操作係統強行關閉出錯的應用程序,以防止其錯誤擴大。這時候,就會出現上述的“寫內存”錯誤,並指出被引用的內存地址為“0x00000000”。
內存分配失敗故障的原因很多,內存不夠、係統函數的版本不匹配等都可能有影響。因此,這種分配失敗多見於操作係統使用很長時間後,安裝了多種應用程序(包括無意中“安裝”的病毒程序),更改了大量的係統參數和係統文件之後。
二、應用程序由於自身BUG引用了不正常的內存指針
在使用動態分配的應用程序中,有時會有這樣的情況出現:程序試圖讀寫一塊“應該可用”的內存,但不知為什麽,這個預料中可用的指針已經失效了。有可能是“忘記了”向操作係統要求分配,也可能是程序自己在某個時候已經注銷了這塊內存而“沒有留意”等等。注銷了的內存被係統回收,其訪問權已經不屬於該應用程序,因此讀寫操作也同樣會觸發係統的保護機製,企圖“違法”的程序唯一的下場就是被操作終止運行,回收全部資源。計算機世界的法律還是要比人類有效和嚴厲得多啊! 像這樣的情況都屬於程序自身的BUG,你往往可在特定的操作順序下重現錯誤。無效指針不一定總是0,因此錯誤提示中的內存地址也不一定為“0x00000000”,而是其他隨機數字。
如果係統經常有所提到的錯誤提示,下麵的建議可能會有幫助:
1.查看係統中是否有木馬或病毒。這類程序為了控製係統往往不負責任地修改係統,從而導致操作係統異常。平常應加強信息安全意識,對來源不明的可執行程序絕不好奇。
2.更新操作係統,讓操作係統的安裝程序重新拷貝正確版本的係統文件、修正係統參數。有時候操作係統本身也會有BUG,要注意安裝官方發行的升級程序。
3.試用新版本的應用程序。


運行某些程序的時候,有時會出現內存錯誤的提示,然後該程序就關閉。

“0x????????”指令引用的“0x????????”內存。該內存不能為“read”。

“0x????????”指令引用的“0x????????”內存,該內存不能為“written”。

不知你出現過類似這樣的故障嗎?(0x後麵內容有可能不一樣。)

一般出現這個現象有方麵的,一是硬件,即內存方麵有問題,二是軟件,這就有多方麵的問題了。

下麵先說說硬件:

一般來說,內存出現問題的可能性並不大,主要方麵是:內存條壞了、內存質量有問題,還有就是2個不同牌子不同容量的內存混插,也比較容易出現不兼容的情況,同時還要注意散熱問題,特別是超頻後。你可以使用MemTest 這個軟件來檢測一下內存,它可以徹底的檢測出內存的穩定度。

假如你是雙內存,而且是不同品牌的內存條混插或者買了二手內存時,出現這個問題,這時,你就要檢查是不是內存出問題了或者和其它硬件不兼容。如果都沒有,那就從軟件方麵排除故障了。

先簡單說說原理:內存有個存放數據的地方叫緩衝區,當程序把數據放在其一位置時,因為沒有足夠空間,就會發生溢出現象。舉個例子:一個桶子隻能將一斤的水,當你放入兩斤的水進入時,就會溢出來。而係統則是在屏幕上表現出來。這個問題,經常出現在windows2000和XP係統上,Windows 2000/XP對硬件的要求是很苛刻的,一旦遇到資源死鎖、溢出或者類似Windows 98裏的非法操作,係統為保持穩定,就會出現上述情況。另外也可能是硬件設備之間的兼容性不好造成的。

下麵我從幾個例子給大家分析:

例一:打開IE瀏覽器或者沒過幾分鍾就會出現"0x70dcf39f"指令引用的"0x00000000"內存。該內存不能為“read”。要終止程序,請單擊“確定”的信息框,單擊“確定”後,又出現“發生內部錯誤,您正在使用的其中一個窗口即將關閉”的信息框,關閉該提示信息後,IE瀏覽器也被關閉。 解決方法:修複或升級IE瀏覽器,同時打上補丁。看過其中一個修複方法是,Win2000自升級,也就是Win2000升級到Win2000,其實這種方法也就是把係統還原到係統初始的狀態下。比如你的IE升級到了6.0,自升級後,會被IE5.0代替。

例二:在windows xp下雙擊光盤裏麵的“AutoRun.exe”文件,顯示“0x77f745cc”指令引用的“0x00000078”內存。該內存不能為“written”,要終止程序,請單擊“確定”,而在Windows 98裏運行卻正常。 解決方法:這可能是係統的兼容性問題,winXP的係統,右鍵“AutoRun.exe”文件,屬性,兼容性,把“用兼容模式運行這個程序”項選擇上,並選擇“Windows 98/Me”。win2000如果打了SP的補丁後,隻要開始,運行,輸入:regsvr32 c:\winnt\apppatch\slayerui.dll。右鍵,屬性,也會出現兼容性的選項。

例三:RealOne Gold關閉時出現錯誤,以前一直使用正常,最近卻在每次關閉時出現“0xffffffff”指令引用的“0xffffffff”內存。該內存不能為“read” 的提示。 解決方法:當使用的輸入法為微軟拚音輸入法2003,並且隱藏語言欄時(不隱藏時沒問題)關閉RealOne就會出現這個問題,因此在關閉RealOne之前可以顯示語言欄或者將任意其他輸入法作為當前輸入法來解決這個問題。

例四:我的豪傑超級解霸自從上網後就不能播放了,每次都提示“Ox060692f6”(每次變化)指令引用的“Oxff000011”內存不能為“read”,終止程序請按確定。 解決方法:試試重裝豪傑超級解霸,如果重裝後還會,到官方網站下載相應版本的補丁試試。還不行,隻好換就用別的播放器試試了。

例五:雙擊一個遊戲的快捷方式,“Ox77f5cdO”指令引用“Oxffffffff”內 存,該內存不能為“read” ,並且提示Client.dat程序錯誤。 解決方法:重裝顯卡的最新驅動程序,然後下載並且安裝DirectX9.0。

例六:一個朋友發信息過來,我的電腦便出現了錯誤信息:“0*772b548f”指令引用的“0*00303033”內存,該內存不能為“written”,然後QQ自動下線,而再打開QQ,發現了他發過來的十幾條的信息。 解決方法:這是對方利用QQ的BUG,發送特殊的代碼,做QQ出錯,隻要打上補丁或升級到最新版本,就沒事了。

通過上麵的幾個例子,可以看到,出現故障的原因有好多種,在這裏把已經提到和有可能發生的原因列個表,方便查閱。

解決方法

1、內存條壞了更換內存條

2、雙內存不兼容使用同品牌的內存或隻用一條內存

3、內存質量問題更換內存條

4、散熱問題加強機箱內部的散熱

5、內存和主板沒插好或和其它硬件不兼容等重插內存或換個插糟

6、硬盤有問題更換硬盤

7、驅動問題重裝驅動。如果是新係統,要先安裝主板驅動

8、軟件損壞重裝軟件

9、軟件有BUG打補丁或用最新的版本。

10、軟件和係統不兼容給軟件打上補丁或者試試係統的兼容模式

11、軟件和軟件之間有衝突如果最近安裝了什麽新軟件,卸載了試試

12、軟件要使用到其它相關的軟件有問題重裝相關軟件。比如播放某一格式的文件時出錯,可能是這個文件的解碼器有問題

13、病毒問題殺毒

14、殺毒軟件與係統或軟件衝突由於殺毒軟件是進入底層監控係統的,可能與一些軟件衝突,卸載了試試

15、係統本身有問題有時候操作係統本身也會有BUG,要注意安裝官方發行的升級程序,像SP的補丁,最好要打上。如果還不行重裝係統或更換其它版本的係統了。

使用Windows出現藍色屏幕是經常的事,而且每每因為不清楚錯誤的來源而頻繁重新安裝係統,勞神費時。下列收集了一些windows死機密碼,供大家參考。

數值 敘述

0 0x0000 作業完成。

1 0x0001 不正確的函數。

2 0x0002 係統找不到指定的檔案。

3 0x0003 係統找不到指定的路徑。

4 0x0004 係統無法開啟檔案。

5 0x0005 拒絕存取。

6 0x0006 無效的代碼。

7 0x0007 儲存體控製區塊已毀。

8 0x0008 儲存體空間不足,無法處理這個指令。

9 0x0009 儲存體控製區塊位址無效。

10 0x000a 環境不正確。

11 0x000b 嚐試載入一個格式錯誤的程式。

12 0x000c 存取碼錯誤。

13 0x000d 資料錯誤。

14 0x000e 儲存體空間不夠,無法完成這項作業。

15 0x000f 係統找不到指定的磁碟機。

16 0x0010 無法移除目錄。

17 0x0011 係統無法將檔案移到 其他的磁碟機。

18 0x0012 沒有任何檔案。

19 0x0013 儲存媒體為防寫狀態。

20 0x0014 係統找不到指定的裝置。

21 0x0015 裝置尚未就緒。

22 0x0016 裝置無法識別指令。

23 0x0017 資料錯誤 (cyclic redundancy check)

24 0x0018 程式發出一個長 度錯誤的指令。

25 0x0019 磁碟機在磁碟找不到 持定的磁區或磁軌。

26 0x001a 指定的磁碟或磁片無法存取。

27 0x001b 磁碟機找不到要求的磁區。

28 0x001c 印表機沒有紙。

29 0x001d 係統無法將資料寫入指定的磁碟機。

30 0x001e 係統無法讀取指定的裝置。

31 0x001f 連接到係統的某個裝置沒有作用。

32 0x0020 the process cannot access the file because it is being used by another process.

33 0x0021 檔案的一部份被鎖定, 現在無法存取。

34 0x0022 磁碟機的磁片不正確。 請將 %2 (volume serial number: %3) 插入磁碟機 %1。

36 0x0024 開啟的分享檔案數量太多。

38 0x0026 到達檔案結尾。

39 0x0027 磁碟已滿。

50 0x0032 不支援這種網路要求。

51 0x0033 遠端電腦無法使用。

52 0x0034 網路名稱重複。

53 0x0035 網路路徑找不到。

54 0x0036 網路忙碌中。

55 0x0037 the specified network resource or device is no longer available.

56 0x0038 the network bios command limit has been reached.

57 0x0039 網路配接卡發生問題。

58 0x003a 指定的伺服器無法執行要求的作業。

59 0x003b 網路發生意外錯誤。

60 0x003c 遠端配接卡不相容。

61 0x003d 印表機佇列已滿。

62 0x003e 伺服器的空間無法儲存等候列印的檔案。

63 0x003f 等候列印的檔案已經刪除。

64 0x0040 指定的網路名稱無法使用。

65 0x0041 拒絕存取網路。

66 0x0042 網路資源類型錯誤。

67 0x0043 網路名稱找不到。

68 0x0044 超過區域電腦網路配接卡的名稱限製。

69 0x0045 超過網路 bios 作業階段的限製。

70 0x0046 遠端伺服器已經暫停或者正在起始中。

71 0x0047 由於連線數目已達上限,此時無法再連線到這台遠端電腦。

72 0x0048 指定的印表機或磁碟裝置已經暫停作用。

80 0x0050 檔案已經存在。

82 0x0052 無法建立目錄或檔案。

83 0x0053 int 24 失敗

84 0x0054 處理這項要求的儲存體無法使用。

85 0x0055 近端裝置名稱已經在使用中。

86 0x0056 指定的網路密碼錯誤。

87 0x0057 參數錯誤。

88 0x0058 網路發生資料寫入錯誤。

89 0x0059 此時係統無法執行其他行程。

100 0x0064 無法建立其他的係統 semaphore。

101 0x0065 屬於其他行程專用的 semaphore 。

102 0x0066 semaphore 已經設定,而且無法關閉。

103 0x0067 無法指定 semaphore 。

104 0x0068 在岔斷時間無法要求專用的 semaphore 。

105 0x0069 此 semaphore 先前的擁有權已經結束。

106 0x006a 請將磁片插入 %1。

107 0x006b 因為代用的磁片尚未插入,所以程式已經停止。

108 0x006c 磁碟正在使用中或被鎖定。

109 0x006d pipe 已經中止。

110 0x006e 係統無法開啟指定的 裝置或檔案。

111 0x006f 檔名太長。

112 0x0070 磁碟空間不足。

113 0x0071 沒有可用的內部檔案識別字。

114 0x0072 目標內部檔案識別字不正確。

117 0x0075 由應用程式所執行的 ioctl 呼叫 不正確。

118 0x0076 寫入驗證參數值不正確。

119 0x0077 係統不支援所要求的指令。

120 0x0078 此項功能僅在 win32 模式有效。

121 0x0079 semaphore 超過逾時期間。

122 0x007a 傳到係統呼叫的資料區域 太小。

123 0x007b 檔名、目錄名稱或儲存體標簽語法錯誤。

124 0x007c 係統呼叫層次不正確。

125 0x007d 磁碟沒有設定標簽。

126 0x007e 找不到指定的模組。

127 0x007f 找不到指定的程序。

128 0x0080 沒有子行程可供等待。

129 0x0081 %1 這個應用程式無法在 win32 模式下執行。

130 0x0082 attempt to use a file handle to an open disk partition for an

operation other than raw disk i/o.

131 0x0083 嚐試將檔案指標移至檔案開頭之前。

132 0x0084 無法在指定的裝置或檔案,設定檔案指標。

133 0x0085 join 或 subst 指令 無法用於 內含事先結合過的磁碟機。

134 0x0086 嚐試在已經結合的磁碟機,使用 join 或 subst 指令。

135 0x0087 嚐試在已經替換的磁碟機,使 用 join 或 subst 指令。

136 0x0088 係統嚐試刪除 未連結過的磁碟機的連結關係。

137 0x0089 係統嚐試刪除 未替換過的磁碟機的替換關係。

138 0x008a 係統嚐試將磁碟機結合到已經結合過之磁碟機的目錄。

139 0x008b 係統嚐試將磁碟機替換成已經替換過之磁碟機的目錄。

140 0x008c 係統嚐試將磁碟機替換成已經替換過之磁碟機的目錄。

141 0x008d 係統嚐試將磁碟機 subst 成已結合的磁碟機 目錄。

142 0x008e 係統此刻無法執行 join 或 subst。

143 0x008f 係統無法將磁碟機結合或替換同一磁碟機下目錄。

144 0x0090 這個目錄不是根目錄的子目錄。

145 0x0091 目錄仍有資料。

146 0x0092 指定的路徑已經被替換過。

147 0x0093 資源不足,無法處理這項 指令。

148 0x0094 指定的路徑這時候無法使用。

149 0x0095 嚐試要結合或替換的磁碟機目錄,是已經替換過的的目標。

150 0x0096 config.sys 檔未指定係統追蹤資訊,或是追蹤功能被取消。

151 0x0097 指定的 semaphore事件 dosmuxsemwait 數目不正確。

152 0x0098 dosmuxsemwait 沒有執行;設定太多的 semaphore。

153 0x0099 dosmuxsemwait 清單不正確。

154 0x009a 您所輸入的儲存媒體標 元長度限製。

155 0x009b 無法建立其他的執行緒。

156 0x009c 接收行程拒絕接受信號。

157 0x009d 區段已經被舍棄,無法被鎖定。

158 0x009e 區段已經解除鎖定。

159 0x009f 執行緒識別碼的位址不正確。

160 0x00a0 傳到 dosexecpgm 的引數字串不正確。

161 0x00a1 指定的路徑不正確。

162 0x00a2 信號等候處理。

164 0x00a4 係統無法建立執行緒。

167 0x00a7 無法鎖定檔案的部份範圍。

170 0x00aa 所要求的資源正在使用中。

173 0x00ad 取消範圍的鎖定要求不明顯。

174 0x00ae 檔案係統不支援自動變更鎖定類型。

180 0x00b4 係統發現不正確的區段號碼。

182 0x00b6 作業係統無法執行 %1。

183 0x00b7 檔案已存在,無法建立同一檔案。

186 0x00ba 傳送的旗號錯誤。

187 0x00bb 指定的係統旗號找不到。

188 0x00bc 作業係統無法執行 %1。

189 0x00bd 作業係統無法執行 %1。

190 0x00be 作業係統無法執行 %1。

191 0x00bf 無法在 win32 模式下執行 %1。

192 0x00c0 作業係統無法執行 %1。

193 0x00c1 %1 不是正確的 win32 應用程式。

194 0x00c2 作業係統無法執行 %1。

195 0x00c3 作業係統無法執行 %1。

196 0x00c4 作業係統無法執行 這個應用程式。

197 0x00c5 作業係統目前無法執行 這個應用程式。

198 0x00c6 作業係統無法執行 %1。

199 0x00c7 作業係統無法執行 這個應用程式。

200 0x00c8 程式碼的區段不可以大於或等於 64kb。

201 0x00c9 作業係統無法執行 %1。

202 0x00ca 作業係統無法執行 %1。

203 0x00cb 係統找不到輸入的環境選項。 r

205 0x00cd 在指令子目錄下,沒有任何行程有信號副處理程式。

206 0x00ce 檔案名稱或副檔名太長。

207 0x00cf ring 2 堆疊使用中。

208 0x00d0 輸入的通用檔名字元 * 或 ? 不正確, 或指定太多的通用檔名字元。

209 0x00d1 所傳送的信號不正確。

210 0x00d2 無法設定信號處理程式。

212 0x00d4 區段被鎖定,而且無法重新配置。

214 0x00d6 附加到此程式或動態連結模組的動態連結模組太多。

215 0x00d7 can’’’’’’’’t nest calls to loadmodule.

230 0x00e6 the pipe state is invalid.

231 0x00e7 所有的 pipe instances 都在忙碌中。

232 0x00e8 the pipe is being closed.

233 0x00e9 no process is on the other end of the pipe.

234 0x00ea 有更多可用的資料。

240 0x00f0 作業階段被取消。

254 0x00fe 指定的延伸屬性名稱無效。

255 0x00ff 延伸的屬性不一致。

259 0x0103 沒有可用的資料。

266 0x010a 無法使用 copy api。

267 0x010b 目錄名稱錯誤。

275 0x0113 延伸屬性不適用於緩衝區。

276 0x0114 在外掛的檔案係統上的延伸屬性檔案已經毀損。

277 0x0115 延伸屬性表格檔滿。

278 0x0116 指定的延伸屬性代碼無效。

282 0x011a 外掛的這個檔案係統不支援延伸屬性。

288 0x0120 意圖釋放不屬於叫用者的 mutex。

298 0x012a semaphore 傳送次數過多。

299 0x012b 隻完成 read/writeprocessmemory 的部份要求。

317 0x013d 係統找不到位於訊息檔 %2 中編號為 0x%1 的訊息。

487 0x01e7 嚐試存取無效的位址。

534 0x0216 運算結果超過 32 位元。

535 0x0217 通道的另一端有一個行程在接送資料。

536 0x0218 等候行程來開啟通道的另一端。

994 0x03e2 存取延伸的屬性被拒。

995 0x03e3 由於執行緒結束或應用程式要求,而異常終止 i/o 作業。

996 0x03e4 重疊的 i/o 事件不是設定成通知狀態。

997 0x03e5 正在處理重疊的 i/o 作業。

998 0x03e6 對記憶體位置的無效存取。

999 0x03e7 執行 inpage 作業發生錯誤。

1001 0x03e9 遞回太深,堆疊滿溢。

1002 0x03ea 視窗無法用來傳送訊息。

1003 0x03eb 無法完成這項功能。

1004 0x03ec 旗號無效。

請您先登陸,再發跟帖!