首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

[Debug]

2012-02-28 
[Debug]高手进.window出错报告:theinstructionat0x010301ff referencememoryat0x******** .thememoryc

[Debug]高手进.
window出错报告:
the   instruction   at   "0x010301ff "   reference   memory   at   "0x******** ".   the   memory   can 't   be   read.

我的问题是:
1:通常应用程序出错,windows都是直接把进程关闭,提示:,你的进程遇到问题需要关闭.我们对此引起的不便表示道歉。
我们可以点击   单击此处查看详细出错信息。

为什么上面   windows   却以   the   instruction   at   ....   来提示出错。

2:通常应用程序的函数地址,都是以004*****开头,因为exe的默认加载地址是   00400000.
      通常的dll内部的函数地址,都以6*******,或7*******,或1*******开头,
      7*******   开头的地址,是系统dll的默认加载地址
      1*******   开头的地址,是用户dll的默认加载地址
      6*******   开头的地址,是当用户dll的默认加载地址有冲突时,系统默认重定位的地址
      (以上三句,是我的个人理解,应该问题不大)
     
      问题是:为什么windows提示的出错指令   是   010301ff,这个地址和谁都挨不着边呀。。。。
      老大们救命,我想,肯定是我上面的对exe   或   dll   的加载的地址的理解有误,但不知道错在哪。




[解决办法]
程序中存在越界访问或者存在野指针被解引用操作。

例如 一个指针new获得的空间被delete后又被使用 ...
[解决办法]
无稽之谈
[解决办法]
输出map文件,然后运行,看看是那里错误。
调试好办看看 函数调用栈,如果没有,那肯定是越界了
[解决办法]
理解很对啊。0x01xxxxxx 这样的地址,有可能是程序分配出一块内存,然后在里面写了一些指令,比如atl的trunk指令和VCL的窗口过程都是这样的。
[解决办法]
可以的话,
断点单步运行你的程序吧,
定位一下错误的语句位置 ...

然后分析一下,
出错位置的几个变量都在之前进行了什么操作 ...
[解决办法]
指针问题吧,一次两次不出错,后面就跑飞了
到那里都不奇怪吧
[解决办法]
如果每次都是这个地址,可能就有问题了,毕竟动态分配的内存很多时候地址会变,但差不多都是这个范围。
[解决办法]
很明显,栈上越界了,有地方修改函数的返回地址。
[解决办法]
我用了个小工具看了一下我的程序的地址空间,贴出部分内容,xx.dll都是自己创建的dll,可见 "0x010301ff "这个地址完全可以是你的某个dll中的地址
00400000Image 9412608 14 ERWC e:\jobs\..\XX.exe
00CFA000Free 24576
00D00000Image 4505600 6 ERWC e:\jobs\..\xx.dll
0114C000Free 16384
01150000Mapped 4096 1 -R--
01151000Free 61440
01160000Image 114688 6 ERWC e:\jobs\..\xx.dll
0117C000Free 16384
01180000Mapped 4096 1 -R--
01181000Free 61440
01190000Image 606208 7 ERWC e:\jobs\..\xx.dll
01224000Free 49152
01230000Mapped 4096 1 -R--
01231000Free 61440
01240000Image 155648 6 ERWC e:\jobs\..\xx.dll
01266000Free 40960
01270000Mapped 4096 1 -R--
01271000Free 61440
01280000Image 405504 10 ERWC e:\jobs\..\xx.dll
012E3000Free 53248
012F0000Mapped 4096 1 -R--
012F1000Free 61440
01300000Image 258048 7 ERWC e:\jobs\..\xx.dll
[解决办法]
我用的是Windows核心编程中的一个例子VMMap.exe本来是查看这个程序本身的虚拟地址空间,我加了个控件传入进程ID,可以查看任意现有进程的地址空间



如果是DLL的错误就试试用DLL工程进行调试,有可能会直接跳到出错的程序行 一般是使用了没有初始化的指针或是对象之类的
[解决办法]
内存越界,或者指针为空

热点排行
Bad Request.