[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工程进行调试,有可能会直接跳到出错的程序行 一般是使用了没有初始化的指针或是对象之类的
[解决办法]
内存越界,或者指针为空