1.问题出现
应客户需求做了一台研磨机设备,主要功能是用机器人研磨物料来取代人工,并将研磨生产数据保存和上传,所有动作流程由PLC和机器人控制完成,上位机用Labview编写,主要实现人机操作画面,数据交互、保存、上传等功能。
这么一个轻量级小软件,平时运行内存都不会超过100M,在某年某月的哪个晚上却崩溃了!
2.抽丝剥茧查bug
从业3年还是第一次碰到内存不够的问题,以前做的系统比这个大得多得多都没出现过这种情况,电脑配置虽然才4G,应付这种小软件应该也够用,先打开资源管理器监控一下内存再说,不看不知道,一看吓一跳,每次刚运行时,内存使用确实不到100M,不过5分钟就到两千多、三千多了。
确认好确实本软件运行过程中导致的内存溢出,将问题聚焦于软件本身,从Labview错误弹窗消息来看,错误发生于写入带分隔符的电子表格,从技术上讲这是NI开发的标准写入电子表格函数,出错概率太小。
那么究竟是因为内存溢出导致的写入电子表格出错?还是因为写入电子表格出错导致的内存溢出呢?
Ok,让我打开Labview自带的性能检测工具一探究竟。
(打开方式:工具→性能分析→监测缓冲区分配)
通过监测缓冲区分配,很快就找到了占用大内存的子VI,原来问题出在“读取带分隔符的电子表格”,把此子VI先禁用掉在运行试试看,果然内存使用稳定在100M以内了,看来bug的来源就只有这一处了。
3.手起刀落Debug
为什么官方标准VI会出问题呢?
打个探针监看一下流入到“读取电子表格的数据”才发现每一次读取到的电子表格数据量是前一次的两倍,也就是说写入到电子表格的内容是呈指数级增长的,难怪一开始还稳定,后来滚雪球一样越长越大。
原来,该子VI在更新数据时是先把已有数据读取出来,将新数据取代旧数据后再写入电子表格达到实时更新的效果。
可是在写入电子表格时选择了添加至文件的方式,所以电子表格的数据的写入就成了2的n次方了。
只需要动动手指将写入方式改为“新文件”即可。
*文中部分图片来源网络,如若侵权请联系删除