刚出道时候写了这样一个Bug:(这bug让我们赚了,两个多月没人抽到好东西~)
if ( pChar->m_info.nFateSystemSpend += rmb > LIMIT_RMB ) { pChar->m_info.SetPlayerFlag(Enum_CanGet, true); }
作死的优先级问题
这个功能测了两遍都没发现问题。第二次还是数值策划反馈:一个多月了没爆好产出,有些不正常,再测一遍……
为什么一直没发现?
由于“LIMIT_RMB”外网环境下非常大,QA要跑到很麻烦,所以内网测试时把这个值调小了,如此,只要单次消费值“rmb”够大,就能判断通过,然后表现正常
其实这种代码,单步下傻逼都看得出来╮(╯_╰)╭但开发中,根本不知道那里会有问题,也不可能全单步一遍。就在想能否像单步那样捕获变量的状态,方便查错。
——记录变量旧值,在需要的时刻比对旧值、当前值,用于输出——
想做这么个功能。那会碰巧啃完项目的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