前言
我是做企业管理软件的程序员,有一次我遇到一个问题,一段后台作业代码,运行时偶尔会出现运行时异常(runtime exception),但这个异常不是 100% 能重现,运行十次,大概能重现2,3次。而且在系统负载很重的时候,反而一次也不能重现。
更折磨人的是,如果在交互式单步调试模式下,这段代码运行完美,一点问题也没有。既然不能通过单步调试来排错,我的同事们都觉得棘手,最后让我来和这个问题死磕。
后来我采用类似二分查找的方式,把可能引起这个问题的代码层层过滤,最后定位到几行有高度嫌疑的代码,我自己编写了一个测试程序来模拟后台作业执行出错时的运行环境,才找到罪魁祸首:我们的一个模型创建 API,不支持模型创建和模型删除,在一秒钟之内完成。
也就是说,用户在 UI 界面正常操作时,手速再快,也不可能完成在一秒钟之内,做到先创建模型,然后马上删除的操作。但是后台作业是用代码调用 API,在系统负载不高的情况下,一秒钟之内完成创建并且删除的操作,不是一件困难的事情。这个时序问题也解释了为什么这个问题在单步调试模式下无法重现。
下面是文章的正文。
企业管理软件面向的是企业级用户,如果软件出现故障(bug),在某些极端情况下,可能会让企业蒙受巨大的经济损失,故而对软件开发人员在编程规范,软件测试和软件交付之前的验证等各方面都提出了更高的要求。同时,由于企业管理软件自身高度的复杂性,有些故障很难重现或者只能在运行了客户特定业务流程的生产系统上才能重现。这些都给企业管理软件分析和故障处理带来了巨大的挑战。
本文从 Jerry 处理过的一个实际软件故障出发,谈谈自己对企业管理软件里一些棘手故障的处理体会。