Chinaunix首页 | 论坛 | 博客
  • 博客访问: 368102
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:30:56

除虫记之十(CMemFile和优化选项 0.5小时/1人)

忙了这么久,终于要上线了,下午打了准备上线的安装包交给测试部测试去了,测试部提出了一些小的bug,说没什么大问题了,可以上线了。

把那些小bug做了完善后,又打了一个包交给测试部测试,我们这边简单测试了后,就等着测试部说可以走人了,都很轻松。

突然,一个测试人员说,崩溃了!

立刻过去一看,天哪,真的是一个可以重现的bug,这不是要命吗?这个时刻才测出这种问题来!

现象是:在注册的时候,如果输入错误的验证码,弹出一个messagebox,确定后,程序就崩溃了,这个现象只在那台机器上出现,xp系统,sp2。

天啊,怎么会有这种事情,怎么能这个时候才发现,还有一会儿就要往线上传了啊。

在我的机器上做这个测试,发现Debug版本下没有问题,Release版本下以极高的频率点那个弹出的messagebox,比如我按住回车键不动,一会儿就会崩溃。

查看崩溃地址,发现这个地址出现在OleLoadPicture()之中,就是把一块内存区域转换城jpg图片的实现中。
中间采用的是CMemFile加CArhive,IStream等实现的。
立刻想起这个崩溃曾经碰到过的,当时很难重现,又忙于其他的事情没有理会,当时的感觉就是可能在中间的某个处理函数中少加了try...catch块,审核代码,果然有一处没有加异常处理,加上,编译,运行,还是崩溃!

那个急啊!

编译带调试信息的Release版,运行,晕,怎么折腾都没有崩溃了。

要说人急的时候,脑子转的就是快呀,脑子灵光一闪,查看编译选项,发现是MaxSpeed,换成Disable,编译,运行,哈哈,可以了,我按住回车键折腾了几分钟没有崩溃。又换回MaxSpeed,运行了两次就崩溃了。换成MinSize也是崩溃,就Default和Disable不崩溃。

不知道什么原因,怀疑对CMemFile做了优化处理,比如每次分配地址固定啦等等,但不确定。一边传新的文件给测试部测试,一边自己加代码验证是不是分配地址的问题,发现两种情况下的地址都不是一直固定的,搞不懂啊。

准备发版后跟踪汇编看看两种方式有什么不同,以后再说啦。


教训:使用CMemFile出现莫名的bug,优先考虑一下优化的问题。

 

 


--------------------next---------------------

阅读(252) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~