今天收拾书房翻出来个老古董,十几年前用VB6写的库存管理系统竟然还在硬盘角落里躺着。鬼使神差双击了那个.vbp文件,没想到VB6开发环境真在Windows11里跑起来了!刚兴奋地改了两行代码点了运行,啪叽就给我弹个"运行时错误'6'"——内存直接溢出卡死,这破玩意儿搁十年前可是能撑起半个小工厂的系统!
踩坑踩出来的调试血泪史
我撸起袖子就跟这老代码杠上了。头三个小时简直在玩扫雷:
- 坑一:数组越界查得眼瞎
有个ReDim动态数组半夜扩容,下标从0跳到1000时突然报错。我愣是手动在代码里插了二十几个Msgbox "当前下标:" & i,发现是供应商编号超了边界值 - 坑二:空对象诈尸
Set rs = New * 之后没判断EOF,老数据库里某条记录的Date字段是Null,直接让日期计算函数原地爆炸 - 坑三:定时器连环车祸
Timer控件里调用了耗时操作,结果新触发挤掉旧进程,界面卡得像八十岁老太太爬坡
救命三件套实战记录
急得满脑门汗时候突然想起当年师父教的绝活:
第一招:立即窗口抄近道
直接按Ctrl+G弹出立即窗口,当场测试SQL语句:"? "Select From product Where id=" & *",发现有个产品ID带单引号导致语法错误
第二招:本地窗口开天眼
在循环体里设断点后启动,本地窗口实时监控变量变化。眼睁睁看着个Double类型的库存量突然变成"8.8%"——原来旧系统导入数据时没清洗百分号!
第三招:Err对象甩黑锅
在所有Function开头加上:
On Error Resume Next
If * <> 0 Then * "出错位置:" & Erl & " 错误号:" & *
第二天看日志发现某模块累计报错48次,全是用户点打印时没连接打印机
血泪换来的避坑指南
- 千万别信F5万能论!复杂流程要先在立即窗口做单元测试
- 见到Null值比见着老虎还警惕,每个数据库操作前必用IsNull()判空
- 全局错误处理里记得加,我有次被个陈年错误提示纠缠了两天
- Timer事件里放代码要像端着满碗热汤走路——轻手轻脚别洒出来
折腾到后半夜终于听到"叮"一声运行成功,结果打印报表时候发现默认打印机早变成PDF虚拟打印机了。看着A4纸上密密麻麻的库存数据,突然理解为什么当年师父总说"调试不是在修bug,是在跟机器吵架"。正要关电脑时媳妇儿突然探头:"你大半夜噼里啪敲键盘,是在写穿越小说?"
对了,临走前给VB6图标创建快捷方式时发现,这二十多岁的老家伙在任务栏缩略图上居然还显示着8%的进度条——真·祖传BUG!