您的位置:首页 > 其它

[原创]局部数组变量定义超过所分配的最大空间时报错“test dword ptr [eax],eax ; probe page”

2011-05-30 20:31 423 查看
问题是这样的,公司用VC做了个COM组件发给其他单位调用,作用是生成一个特定功能的二维码,该COM组件提供了两个接口,一个是直接打印出来(以下简称接口A),另一个是返回这个二维码图片的Base64字符串(以下简称接口B),这两个接口在发布时用.net进行了调用测试,均没有问题,由于公司不进行java方向的开发,但是客户单位却大多是要用java开发的,所以我们准备了两个调用示例。COM组件V1版,两个示例均能正常工作,等升级到V2版时,只对.net示例进行了测试,测试通过后没有单独对java示例测试,因为感觉改动的地方不影响接口,只是内部实现的一些改动,所以只测了一个,感觉另一个也不会出问题。

天有不测风云,做事一点马虎不得啊,特别是搞程序的,哪个没测都有可能出问题。

java的示例程序出的问题是这样的,调用接口A没有问题,而调用接口B却提示出现如下图所示异常:



分析一下,可知,都是COM组件的接口,一个调用没问题,一个调用有问题,那么COM组件出现问题的可能性还是很大的,但是可恶的是.net程序调用它却没有问题。

作为一个微软技术下的程序员,我对.net熟悉超过java。。。 哥因此郁闷了。

当然,郁闷归郁闷,问题还是要解决的!解决程序bug的最有效办法当然是调试,调试才是王道!好枪手是子弹喂出来的,好程序员是bug喂出来的!

我这个COM组件要调试的话,得先选择一个调用程序啊,.net程序编译后的exe是最好的选择,但是.net程序调用它不出错啊,强烈郁闷,必须得用那个java示例程序去调用发起调试才能发现问题啊。呢不是搞java的,但是也知道java程序先编译在解释执行的,编译成.class文件,然后在jvm下运行。。。 这可如何是好?我总不能在vc下直接浏览到那个.class文件运行吧,这肯定是失败的啊。

解决问题的办法总比问题多,这句话还是很鼓舞人心的!

经过思考,java程序可以通过javac命令编译为.class文件,然后再通过java命令运行此程序,那么我可以把这个java.exe设为vc的调试程序嘛,然后将那个.class文件作为程序参数,这样应该也是可行的。不放过任何一个可能的方法,于是呢进行了艰难的尝试(呢java太烂了,环境变量,jar包引用问题都搞不定,幸好有位仁兄帮助),结果是可喜可贺的,这样确实能调试COM组件了,至少在接口A上打个断点能够被VC调试器捕获到了。。 OYe!设置方式如下图所示:



正当我准备大展身手,调试接口B时,你能想象我当时的感受(bug即将浮出水面被我消灭的兴奋)。不幸再次降临,我在接口B的第一句代码处加了断点,但是没有执行到断点就报告stackoverflow了! omg,不带这么玩人的,COM组件我只是能写,但是深处的东西还是不甚明白的,来了这么一出,接口没进去异常就蹦出来了,让我如何是好?? 于是,我把断点移到了InitInstance方法上去了,这让我知道了,还有个dllmain函数。。 但是我这问题还是解决不了,因为走完dllmain之后断点在F10的点击下跑到了汇编代码里去了,并且在我按100次F10都没有走到我写的代码处,也没有走到那个异常地方,直接一个F5,异常依然在接口函数之前出现了。。



哥这次真的郁闷了,甚至是绝望了,看官可以想想,呢费了那么大劲能调试了,却调试不出bug来,让呢情何以堪?在哥准备放弃的时候,哥最后抱着试试看的想法把上图中异常出现的那句汇编代码Google了一下,呃,奇迹出现了!

哥看到了这个解决了呢搞了一下午的网页,原来是局部数组变量超过了所分配的最大空间的原因,详情去看原网页吧:http://hi.baidu.com/linzch/blog/item/e5107ff0a6cf6ccf7831aa02.html

至于我的接口B为什么需要开辟这么大的空间这里就不说了,总之非常感谢这篇blog的博主!

技术后记:

如果在main函数中,定义一个开辟了过多空间的局部变量,那么即使断点设在第一句话也是不起作用的,如下图所示:



而如果将这个局部变量挪到main函数调用的一个函数test中,那么在main函数中加断点就是可以的,如下图所示:



这样,呢是不是可以猜测系统在调用一个函数之前,是要先对这个函数做一些检查的。请了解的网友给证实一下。非常感谢!

后记2

1.解决问题的方法总比问题多!(我是从马云那里第一次听说这句话的,不知道是不是他原创)

2. 程序在发布出去之前要做全面的测试,不要抱有一丝一毫的侥幸心理!

3. 你感觉可能出问题的地方往往肯定会出现问题,所以有意识赶紧进行确认,进行证实!

4.你遇到的所有问题,你的前辈们肯定都遇到过了,没事多Google还是很好的!

5. 搞清原理很重要!Know Why!

6.坚持就是胜利!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐