较早前跟同事测试的时候偶然发现了net-snmp SDK中的snmp_set_var_typed_value()函数的一个"BUG"。当时的过程非常有趣(误打误撞)且具有一定的典型性(跨平台、SDK),故在此与大家分享:
我有一位亦师亦友的同事在工作之余独立开发了一套可管理我们设备的SNMP网管软件(本公司已设有另外的团队做该类产品),让我帮忙给他测试通信服务器部分,该部分基于VC6.0开发。测试了一段时间,虽有一些小瑕疵但是功能方面大的BUG一直未出现。一切都那么正常。
正当我们为其正确性感到高兴的时候,突然发现某些时候访问某设备会出现超时异常。起初我们都认为是服务器代码有问题,单步调试了许久,但是却没有浮现该错误,反倒是出现了另外的错误。在排除干扰后,我们怀疑还是设备本身出了问题(因为该设备是已通过评审鉴定、开始量产的设备,而且此前做过多次类似的测试都没有发现那样的问题,所以我们一开始对它抱有很强的信心,并没有怀疑它,通过这件事也告诉大家在分析问题时千万不要抱有太强的主观判断,不放过每种可能性)。于是我们立马用第三方测试软件MIB browser测试了一下,果真是设备出了问题。可问题出在哪里呢?
错误难以重现,设备现在又处于“宕机”状态,一筹莫展,找不到什么好的对策来定位错误,只好乖乖的重启设备,一编一遍的读取设备的参数(有点多,上百个)啦,最后终于找出了引起访问异常的那个参数,同时查看设备状态,发现设备内存占用急剧上升,不多久就内存耗尽。咦!难道是内存泄露?马上查看设备代码,目测了几分钟,大家四目相对,”这么简短的几行代码哪会出现内存泄露呢?“(当时那个时候我们仍然犯了先入为主的错误,因为snmpd代理是用net-snmp的开发包开发的,net-snmp又是业界最著名的SDK,