刚进实验室,老师给我一项任务:一个已经开发好的软件,有两个BUG,要我去改。软件是用C#写的,这个以前没搞过C#。所以就一边看书学习一边看代码。
第一个BUG其实严格来说不叫BUG,而是功能的完善:目前软件的日志只能在本软件中保存和打开查看,我需要把日志以Word文档形式导出来。这个功能的实现我用了大概一周就基本完成了。后来就把精力全放在第二个BUG上了。第二个BUG是:本软件要调用外部COM组件,但是在执行某些COM组件时,程序运行到一半就自行退出,崩溃了。听说以前有多个同学搞过这个问题,都没有结果。但是我还是从师兄那学了不少经验,测试的基本方法就是他教我的,这省了我不少时间。开始时只是跟踪到在执行COM组件中的某方法时程序突然退出(崩溃了)。师兄也说是内存溢出,但没有找到解决方法。
我从接触这个软件到现在已经20多天了。一边对软件功能及实现进行熟悉,一边学习C#语言。前几天还一直在调试程序时查看内存、寄存器什么的,可是也没查看出什么眉目。今天在网上搜索了“调试内存泄漏”,结果找到一篇好文章:http://msdn.microsoft.com/zh-cn/magazine/cc163491.aspx 。看到一半我就觉得有戏。试着改了一下代码,其实只改了两行代码而已,问题就解决了,心情很是愉悦!
其实这个软件的问题就是,非托管堆内存泄漏。与非托管代码进行互操作:这是内存泄漏的起因之一,涉及到与非托管代码的互操作,例如在 COM Interop 中通过 P/Invoke 和 COM 对象使用 C 样式的