写了一个月的代码,前几天总算基本完工了,结果交给别人一用,处理稍大一点的文件竟然100%会crash。因为毕竟现在写代码手生的厉害,再加上时间太紧也没有对自己的程序进行过很充分的自测,心虚的很,所以只好发狠连续加班熬夜找自己的bug。

      从现象看,每次crash都是new, delete 或者malloc出的错,或者有时一个HANDLE莫名其妙地变成了一个非法值,应该是由于内存越界引起的。但是内存越界实在太难找了,心想该不会要动用Bounds Check之类的东东吧,那个家伙我不熟,这么短短的几天恐怕是学都学不会,可那边是火烧眉毛着急催着呢。最终横下一条心,还是用笨办法,回头一行一行啃自己的代码吧。

      首先第一步,怀疑是线程之间同步做得不好,于是小心翼翼地把几个线程的代码完全重新写了一遍(幸亏主要的功能都封装在类里了,所以线程的主体代码不是很多),Crash。
      第二步,把所有对数据的处理都注释掉,保留的代码只是读数据、放入buffer,取数据,释放...之类的简单操作,还是Crash...(不过这样也好,如果问题只是出在这些地方,那倒好找了,心中稍稍放松了些)
      第三步,轻松之际,仔细看了一下自己对buffer操作的函数,可是却死活没发现有什么问题,互斥和同步都做得很好,分配和释放内存也都很小心,于是怀疑是不是自己写的Queue模板有问题。
      第四步,检查自己的Queue类,总共不到300行程序,却楞是看不到内存越界的迹象。如果对这些代码反复琢磨和运行10遍以上还没看出哪里有内存越界,我想我就可以改行,或者回到大二重学一遍数据结构了(当时只考了61分,好悬 )...线索到此中断...心中又是一紧

      悲痛难过中......

      正在不知所措的时候,偶尔打开Visual Studio的Project Properties,发现有一个编译参数,Runtime Library,其中有这么两个让我印象深刻的选项:Multi-threaded Debug (/MTd) 和Single-threaded Debug (/MLd),我写的是Multi-thread,但这里我用的是缺省参数:Single-threaded Debug (/MLd)。隐隐约约我记得第一次用VC写多线程的时候就犯过这样的错误,但毕竟当时是可以容忍的,而现在...没什么好说的,结果就是加班加班再加班......老大说得对,做事情是需要素材的,我觉得我就一直是个没有素材的人。我最缺乏的也是稳重和积累...

      第一个项目感觉做地磕磕绊绊的,希望到时候能顺利交差就好了。昨天同学聚会,只喝了一点点酒,虽然酒量一向不济,但也不至于如此萎靡,眼看自己都要快Crash了,最后靠打盹喝疙瘩汤出了点汗才好起来,郁闷!
posted on 2004-12-18 20:50  玄驹子  阅读(1024)  评论(3编辑  收藏  举报