[Debug]高手进.

tlz1016 2007-07-27 02:05:31
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 的加载的地址的理解有误,但不知道错在哪。


...全文
315 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tlz1016 2007-08-08
  • 打赏
  • 举报
回复
谢谢各位的参与!
虽然那个地址为什么是那个值仍不失太明白。不过问题我极影解决了。

使用minidump调试技术,可直接定位到崩溃的代码行。
lmnihf2001 2007-07-31
  • 打赏
  • 举报
回复
我用的是Windows核心编程中的一个例子VMMap.exe本来是查看这个程序本身的虚拟地址空间,我加了个控件传入进程ID,可以查看任意现有进程的地址空间

如果是DLL的错误就试试用DLL工程进行调试,有可能会直接跳到出错的程序行 一般是使用了没有初始化的指针或是对象之类的
飞哥 2007-07-31
  • 打赏
  • 举报
回复
内存越界,或者指针为空
tlz1016 2007-07-28
  • 打赏
  • 举报
回复
如果真的是dll中出错了,如何找到这个错误呢?


很明显,栈上越界了,有地方修改函数的返回地址。
//
也可能是这个问题,我试过故意把函数返回地址修改为010301ff,的确会报这个错误.
tlz1016 2007-07-28
  • 打赏
  • 举报
回复
谢谢楼上。
请问你用的是什么工具?怎么查看其在运行期的地址?(我知道Depends可以本地查看,可是都是以1*******开头的)

另外,
010301ff <---------- 栈顶在这!
my.exe! 00412e66()
my.exe! 004133f8()
my.exe! 00401de6()
other.dll! 0023a6fe()------------------->这里也基本可以看出,dll地址好像是从0023a6fe开始的
my.exe! 00403aad()
lmnihf2001 2007-07-27
  • 打赏
  • 举报
回复
我用了个小工具看了一下我的程序的地址空间,贴出部分内容,xx.dll都是自己创建的dll,可见"0x010301ff"这个地址完全可以是你的某个dll中的地址
00400000 Image 9412608 14 ERWC e:\jobs\..\XX.exe
00CFA000 Free 24576
00D00000 Image 4505600 6 ERWC e:\jobs\..\xx.dll
0114C000 Free 16384
01150000 Mapped 4096 1 -R--
01151000 Free 61440
01160000 Image 114688 6 ERWC e:\jobs\..\xx.dll
0117C000 Free 16384
01180000 Mapped 4096 1 -R--
01181000 Free 61440
01190000 Image 606208 7 ERWC e:\jobs\..\xx.dll
01224000 Free 49152
01230000 Mapped 4096 1 -R--
01231000 Free 61440
01240000 Image 155648 6 ERWC e:\jobs\..\xx.dll
01266000 Free 40960
01270000 Mapped 4096 1 -R--
01271000 Free 61440
01280000 Image 405504 10 ERWC e:\jobs\..\xx.dll
012E3000 Free 53248
012F0000 Mapped 4096 1 -R--
012F1000 Free 61440
01300000 Image 258048 7 ERWC e:\jobs\..\xx.dll
  • 打赏
  • 举报
回复
很明显,栈上越界了,有地方修改函数的返回地址。
superarhow 2007-07-27
  • 打赏
  • 举报
回复
如果每次都是这个地址,可能就有问题了,毕竟动态分配的内存很多时候地址会变,但差不多都是这个范围。
ppcat_001 2007-07-27
  • 打赏
  • 举报
回复
指针问题吧,一次两次不出错,后面就跑飞了
到那里都不奇怪吧
tlz1016 2007-07-27
  • 打赏
  • 举报
回复
我主要是对那个指令的地址,感到很奇怪...010301ff,,,这个指令,怎么看都觉得不爽!
tlz1016 2007-07-27
  • 打赏
  • 举报
回复
可以的话,
断点单步运行你的程序吧,
定位一下错误的语句位置 ...

然后分析一下,
出错位置的几个变量都在之前进行了什么操作 ...

/////
程序在我的电脑上运行没问题,同事的电脑上也没问题,我们的都是XP.

公司有一个windows2000的旧电脑,运行我的程序10次有1次出现上边的问题.出现问题时,是在刚启动程序是宕掉了.
jixingzhong 2007-07-27
  • 打赏
  • 举报
回复
可以的话,
断点单步运行你的程序吧,
定位一下错误的语句位置 ...

然后分析一下,
出错位置的几个变量都在之前进行了什么操作 ...
tlz1016 2007-07-27
  • 打赏
  • 举报
回复
理解很对啊。0x01xxxxxx 这样的地址,有可能是程序分配出一块内存,然后在里面写了一些指令,比如atl的trunk指令和VCL的窗口过程都是这样的。
/////
谢谢,好像就是这样,有这样的解释 感觉好多了。
tlz1016 2007-07-27
  • 打赏
  • 举报
回复
我把调用堆栈给出来:
call stack

010301ff <---------- 栈顶在这!
my.exe! 00412e66()
my.exe! 004133f8()
my.exe! 00401de6()
other.dll! 0023a6fe()
my.exe! 00403aad()
superarhow 2007-07-27
  • 打赏
  • 举报
回复
理解很对啊。0x01xxxxxx 这样的地址,有可能是程序分配出一块内存,然后在里面写了一些指令,比如atl的trunk指令和VCL的窗口过程都是这样的。
tlz1016 2007-07-27
  • 打赏
  • 举报
回复
谢谢 虫虫 关注

如果是我的程序的指针操作错误,提示的出错地址应该是 004****** 才对,这样我能根据map文件 查找是哪个函数的问题,可是上面的指令 010301ff ,我怎么找到是哪的错误?
  • 打赏
  • 举报
回复
输出map文件,然后运行,看看是那里错误。
调试好办看看 函数调用栈,如果没有,那肯定是越界了
lddLinan 2007-07-27
  • 打赏
  • 举报
回复
无稽之谈
jixingzhong 2007-07-27
  • 打赏
  • 举报
回复
程序中存在越界访问或者存在野指针被解引用操作。

例如 一个指针new获得的空间被delete后又被使用 ...
tlz1016 2007-07-27
  • 打赏
  • 举报
回复

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧