TA的每日心情 | 开心 2014-7-28 21:47 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
“0x????????”指令引用的“0x????????”内存
0 _0 x6 Z4 {6 u" m/ \ g
5 C$ \* H! w3 ?9 i! x- \运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭。 6 N8 n' u s0 W) C5 C
0 d! a( X+ R/ A V“0x????????”指令引用的“0x????????”内存。该内存不能为“read”。 # G! X% y: n( g0 \2 O3 \$ e
2 E1 V$ n; Z5 k: \“0x????????”指令引用的“0x????????”内存,该内存不能为“written”。 - r8 W6 \) P0 S7 [% v( V0 S" [" K, l
4 M8 q k2 x% K+ u2 `+ @
以上的情况相信大家都应该见到过,甚至说一些网友因为不爽于这个经常出现的错误提示而屡次重装系统。相信普通用户应该不会理解那些复杂的十六进制代码。
0 H; R- a: [0 m+ q$ Y* Y2 j6 W( D9 S$ F( V
出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了。 6 {9 S+ L P' ^& Y
2 E4 d$ M( O- L% Z F
一:先说说硬件:
+ L5 T2 v* D( `1 Z
1 f% B( b2 d) e! j* V6 s一般来说,电脑硬件是很不容易坏的。内存出现问题的可能性并不大(除非你的内存真的是杂牌的一塌徒地),主要方面是:1。内存条坏了(二手内存情况居多)、2。使用了有质量问题的内存,3。内存插在主板上的金手指部分灰尘太多。4。使用不同品牌不同容量的内存,从而出现不兼容的情况。5。超频带来的散热问题。你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。
! R% j G3 V: I3 N
3 Y% D1 F8 s- y二、如果都没有,那就从软件方面排除故障了。
$ u: N0 E/ I- ^7 D2 i! J6 b3 u0 l( Y( n! ^3 T" b2 v! O2 `
先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“光标”。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的光标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用光标,继续在之后的执行中使用这块内存。真正的0地址内存区储存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的内存不能为“read”错误,并指出被引用的内存地址为“0x00000000“。内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中“安装”的病毒程序),更改了大量的系统参数和系统档案之后。
3 Q0 A1 l' {# l- V7 E0 `- Q& \' d) ]2 A8 T* |1 D
在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,但不知为什么,这个预料中可用的光标已经失效了。有可能是 “忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图“违法”的程序唯一的下场就是被操作终止执行,回收全部资源。计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。无效光标不一定总是0,因此错误提示中的内存地址也不一定为 “0x00000000”,而是其它随机数字。 0 x+ u( x: w" Z& S3 @
- W+ J1 \" `! @, s9 D) u首先建议:
% [+ l/ V6 \% h" U6 e% X$ e# I' B5 r0 p/ ^+ n
1、 检查系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。 3 t, |2 ?( t/ ?: M
. ~. |" J6 {( c& k! y
2、 更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统档案、修正系统参数。有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序。 l5 |; q5 O# v+ i8 \! C
8 ]* N2 K1 M; ?1 _
“0x????????”指令引用的“0x????????”内存' @2 `" K% P8 g+ Z8 H2 x" x) i
' ?- X" J# `/ ^: t" e4 E
3、 尽量使用最新正式版本的应用程序、Beta版、试用版都会有BUG。 ) T& ~$ k5 c0 s$ p- s- w1 j
4 ^* f9 G6 P4 S4、 删除然后重新创建 Winnt\System32\Wbem\Repository 文件夹中的文件:在桌面上右击我的电脑,然后单击管理。在"服务和应用程序"下,单击服务,然后关闭并停止 Windows Management Instrumentation 服务。 删除 Winnt\System32\Wbem\Repository 文件夹中的所有文件。(在删除前请创建这些文件的备份副本。)打开"服务和应用程序",单击服务,然后打开并启动 Windows Management Instrumentation 服务。当服务重新启动时,将基于以下注册表项中所提供的信息重新创建这些文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs
( W& o3 K* D: W5 D) _ X$ l: p# W1 C! f6 z, r
下面搜集几个例子给大家分析: 2 C# U' M8 a0 t0 Q3 A0 g
4 N& a( P3 d" @0 n' `
例一:IE浏览器出现“0x0a8ba9ef”指令引用的“0x03713644” 内存,或者“0x70dcf39f”指令引用的“0x00000000”内存。该内存不能为“read”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。解决方法:
; b; M0 P3 J k- N0 ~" W( d9 H) b g' {! V
1、 开始-运行窗口,输入“regsvr32 actxprxy.dll”回车,接着会出现一个信息对话 框“DllRegisterServer in actxprxy.dll succeeded”,确定。再依次运行以下命令。(这个方法有人说没必要,但重新注册一下那些.dll对系统也没有坏处,反正多方下手,能解决问题就行。) - [+ [; y2 z0 L2 M
9 _8 _% I* h' Kregsvr32 shdocvw.dll ! |& V' F/ `4 |/ l
" V" S" c- k6 \$ @8 Sregsvr32 oleaut32.dll
/ P* e2 r8 S4 k8 u% o" n$ X; l5 \' D. q9 n* E7 C2 A
regsvr32 actxprxy.dll
. \+ T7 z6 ]; \9 }$ A0 Z! Q6 A# P
regsvr32 mshtml.dll 2 r6 ^/ A( o" L0 B
& }1 a( d0 S7 \regsvr32 msjava.dll
8 d4 t2 F% b. G2 T6 n1 } M3 t( ?
( U- K3 c, ]; |regsvr32 browseui.dll ' ^- B$ q6 b9 u$ e2 c6 z
2 J: ~- \+ ?3 e8 V* }4 ?
regsvr32 urlmon.dll
[! ~! H; N3 B* q6 E
6 }! z5 [ R# U2、 修复或升级IE浏览器,同时打上系统补丁。看过其中一个修复方法是,把系统还原到系统初始的状态下。建议将IE升级到了6.0。 ' X0 d% X4 D' d' g! Q" P
' f4 S/ N/ k3 }# t/ f例二:有些应用程序错误: “0x7cd64998” 指令参考的 “0x14c96730” 内存。该内存不能为 “read”。解决方法:Win XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每一个应用程序的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟“内存映像”,并把这些信息储存到Windows\Prefetch文件夹。一旦建立了映像,应用软件的装入速度大大提高。XP的预读取数据储存了最近8次系统启动或应用软件启动的信息。建议将虚拟内存撤换,删除Windows\Prefetch目录下所有*.PF文件,让windows重新收集程序的物理地址。
E' R8 g" p/ V0 Z% G- A7 p1 K i* [4 S' u, ^. f& _& p
例三:在XP下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内存。该内存不能为 “written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。解决方法:这可能是系统的兼容性问题,winXP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项。 ) _7 g# d+ Q m9 [9 O# c: |5 ?
/ G, w4 [3 w4 W/ j& \4 a8 f
例四:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的“0xffffffff”内存。该内存不能为 “read” 的提示。解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne 之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。
. a ~" n9 Q& J. g" l3 e0 v2 _' e7 T+ I- J* j
例五:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“0x060692f6”(每次变化)指令引用的“0xff000011”内存不能为 “read”,终止程序请按确定。解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。 8 p3 f( K$ d, w7 y
3 m: [: R! R" F7 c8 b( G3 i" R& p! n例六:双击一个游戏的快捷方式,“0x77f5cd0”指令引用“0xffffffff”内 存,该内存不能为“read” ,并且提示Client.dat程序错误。解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。 " Y% }, V1 Z$ Y! e8 ?& H/ _
7 Z+ H, f/ @4 j# @0 U, w例七:一个朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”指令引用的“0x00303033”内存,该内存不能为 “written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。8 o3 }7 P- Y( s2 s0 x y
|
|