记一次联调测试的奇异之旅
快中午的时候,RD 陈宜明找我,说线下测试的时候有没有发现一个问题,就是提示变量未定义,notice日志能看到,我记得是没有看见过的,再说平常测试也不关注php notice日志,然后我说我check下,然后发单测试,进行了许多操作,还是没有看到报错信息。
后来,宜明说他修改下然后我中午吃完饭回归下,中午吃完饭刚出去溜达了会儿,RD给我打电话说了一下修改点然后下午做下回归测试,然后我就赶回去了,稍微趴了一小会儿,RD钉钉我给了我diff地址,我看了下改动不大,就是局部变量变成类私有全局变量,因为虚拟机上的下游环境已经变了,我又重新搭了一套,也不知道对不对就改了下服务端口,然后编译成功就启动服务测试了,然后在下游联调代码里打了日志。
logger.Info("hintCode:%d hintContent:%s", trace.HintCode, trace.HintContent)
采用下游代码使用的log库函数打日志,但是打出来居然是这样的:
hintCode:833359333360 hintContent:%!s(*string=0xc208164800)
太恐怖了,明明hintCode是个int,传值是1,为什么下游打出来是这么大的数字,而且hintContent居然不是string?坑爹呢这是。
然后我想,直接交给golang runtime去处理吧,直接按照默认值类型打印,于是改成了这样:
logger.Info("hintCode:%v hintContent:%v ", trace.HintCode, trace.HintContent)
奇葩呀,打出来是这样的:
hintCode:0xc20814b810 hintContent:0xc20814b820
我的天啊,这是个什么鬼,然后找策略QA旭哥看,旭哥看了会儿,各种打日志,也搞不明白,推测是上游,就是我测试的模块没有把数据传过来,然后这些字段就随机赋了值,总感觉这推测是错的。
后来,RD也过来找我了,之前RD已经打了几个电话问了,问查到问题没,我一直说等会等会儿,他着急上线,赶过来催了,恰好测下游的QA也在了,我直接过去找她,描述了一下问题,她说不应该这么打日志,因为可能直接打出的是内存地址,需要用RD封装的方法,我擦,什么鬼,引用了通用日志库,直接打印字段居然是内存地址,接着,我把下游测试地址改连到她的环境上,然后测试,发现她那样打日志则OK,终于确定不是我们的问题了。
RD说他又改了点东西,按照代码规范把一些操作封装成了通用函数,我更新代码,测试,发现php-error了,擦,居然在这时候改出这么一低级bug,往往最放松的时候就最容易出bug,然后RD说他也对php不熟,没改多少代码,居然改出1 bug来,哈哈:-D
接着RD又修改了下,我跟下游QA联调了下,OK!:-D
留给我的疑问是,问什么直接取结构体成员变量打印出来是内存地址呢?因为是thrift协议的原因,还是log库的原因,待我继续追查!
另外,记得直接找能快速解决问题了人,就是事件涉及到的对口人,事半功倍啊,费了一下午时间,真是害人害己。
网友评论