刚出道时候写了这样一个Bug:(这bug让我们赚了,两个多月没人抽到好东西~)
if ( pChar->m_info.nFateSystemSpend += rmb > LIMIT_RMB ) { pChar->m_info.SetPlayerFlag(Enum_CanGet, true); }
作死的优先级问题,让你浪ヽ(.??ˇд ˇ??;)?
关键的,这个功能我们测了两遍都没发现问题。第二次是数值策划反馈:一个多月了没爆好产出,有些不正常,再测一遍……好丢脸(--)凸死ね
为什么一直没发现呢?
由于“LIMIT_RMB”外网环境下非常大,QA要跑到很麻烦,所以内网测试时把这个值调小了,如此,只要单次消费值“rmb”够大,就能判断通过,然后表现正常ヾ(。??∀??)ノ
(PS:表问为毛没单元测试,做过游戏开发赶上线吗亲)
等bug爆出来时候,我的心情是这样的:嗯,意淫了优先级还可以接受,可尼玛被人点名测都没测出来,太丢人了〒_〒
“表作,一条语句一行代码,啥操作都得括起来”……这这还不够哇,怎样更容易暴露问题呢?
其实这种代码,单步下傻逼都看得粗来╮(╯_╰)╭但开发中,我根本不知道那里会有问题,也不可能全单步一遍。就在想能否像单步那样捕获变量的状态,方便查错。
——记录变量旧值,在需要的时刻比对旧值、当前值,用于输出——
想做这么个功能。那会碰巧啃完项目的bytebuffer实现(好奇bytebuffer怎么做到啥数据都能塞),便利用相同思想,实现了DebugFile的“捕获”功能,流式接口设计:
file << "a" << paramA << "f" << paramF << "d" << paramD << "s" << paramS;
内部通过c艹淫荡的模板、函数重载决议,获知输入变量的类型,记录地址,并将旧值拷贝至buffer中。待到DebugFile析构,根据类型,从记录地址中获取变量的当前值,比对buffer中分析出的旧值,按配置写Log。输出可以支持:按函数、功能、消息等分目录分文件。
预先绑定要关心的变量,黑盒跑完功能后,查看相应Log即可获知:某函数、某消息...处理过后,绑定变量的变动情况。
方便查看操作过后,系统的状态改变。
再包装成宏,仅于Debug下生效即可。
源码:https://github.com/3workman/Tools/blob/master/tool/DebugFile.h