![]() |
![]() |
#1 |
高级会员
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望:
50
![]() 现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
bug与debug小议
BUG与DEBUG小议 个人感觉上,debug多少近于软件工程方面的概念。不过话又说回来,如果 我们能以软件工程的态度去对待MUD编程的话,可能很多笑话就都可以避免了。 关于到底什么是bug其实也有很大的争议。最酷的一种说法是:所有对玩家 有利的都是bug(我老婆一直认为这句话是我说的,其实这真是天大的冤枉,这 是我从另外一只马--Ranma那里学来的。而更可能的,Ranma又是从他的老 东家--Tie那里继承过来的这句话);当然,还有一个更官方的说法,“我们把 bug叫做一种功能”。 不管怎么说,update不能通过的问题基本上不在我们的讨论范围里。我们谈 论的是真真正正让大家挠头的臭虫。 如同你所想象的,最可怕的一类bug存在于系统的缺陷当中。add_action()与 too deep mapping导致无法save()这两个bug应该是最具有代表性的了。由于我 们所用的系统--MudOs--本身的缺陷再加上编程的错误,造成了一些可怕 的事情发生(这个我不用再提醒大家是什么可怕的事情了吧:P)。另外据我所知 道,应该还有一个在逃的bug,会造成和前两个东东同样的后果。但是请不要问 我是什么,我也不知道,仔细研究的结果是没有结果:((。更酷的说法来自一个 两年以前就失踪了的“人口”,辗转相传出来的结论是MudOs可能存在类似buffer overflow的漏洞。之所以说是类似,就是这个漏洞的机理和buffer overflow有类 似的地方,但是不太一样。不过我个人对编程技术不精通,所以要研究这个问题 真就是无从下手了。 如果说,上边这种bug属于天灾人祸的话。那么,其余我们平常会看到或者 用到(em。。。很奇怪的说法是吧,okok,我承认我自己比较喜欢用bug来玩 mud,话说回来,不然这篇文章就不该我来写了吧)的那些个bug就全都是编程 和思考不慎的“结晶”了。 考虑再三,我想还是只讨论xkx,xyj,fy,es2这些个经典老mud的bug,而 对于国内机遇这些mud衍生出来的mud我就尽量不去写了(毕竟,这几个老mud 的制作者基本都不在国内,我这样揭短也不大容易被扁),如果必要,我也会 举一些我们XO(是不是还是需要说明一下呢,我说的xo是清华xo_group的xo, 不是那个什么深圳笑傲江湖II那个傻X mud,ok我就这么说,不爱听的可以不听) 里边的bug。反正总之是跟各位没有什么切身利益啦,所以请大家稍安毋躁,听 我来扯一扯。 把我开头说的那种类型的bug排除出去,剩下的bug大致就可以归为以下几类 了(基本上我所说的大家都不用回自己的lib里边找了吧,该改的也应该都改了。 我确定没有改的估计也不大会在公开场合讨论): 1。粗心造成小问题。通常来说,把标记写错就是这种bug的典型案例,一般 来说,这种问题会在测试期间被发现。不过也有例外,XO的当铺也是在玩家身 上加标记那种类型,只是不同地方的当铺之间不通存通取,分属于不同的mapping。 99年的时候有巫师给当铺存货加上了过期的设定,就是一旦存的东西超过了期 限,物品就会拿到当铺去卖。但是由于粗心,在删除玩家身上标记的时候,少 写了当铺名那一层mapping,导致了一个好好的设定变成了clone的bug了。 2。写mud的人不太熟悉底层或者lpc本身造成的bug。老实说,这种bug真真 正正才都是经典bug。而且也都是经典的人制造出来的。举两个例子,一个就是 钱的bug,另外一个就是combine物件本身。 谁谁家那个小谁说起我一度拿着钱和add_action()的bug到处乱跑。其实我用 的不止这些啦:),只不过钱的bug很好用而已。而且用cash把自己压到99% 负重对于当时年轻的我来说却是比较拽阿(原谅我吧,阿门)。简单说,钱都是 combine物件,从es2继承过来的mud最初基本上都没有动这一部分,所以早期 的xkx,fy2等等全部中招:)。当初写这个combined.c的人大概是为了偷懒,为了 方便在物件被destruct的时候还能取到物件的name,所以很前卫的用了一个 call_out("destruct",0,this_object())。这个0真是经典,因为0和1在这里没有区别。 想想你有100gold,存进了银行,但是在两秒中之内这些gold还在你身上。。。 double一下很容易了吧:)。 其实改这个bug很容易,直接从combined.c动手是最好的,不过当时很多巫 师由于没有搞清楚造成bug的根源,所以大多采取了指标不治本的方法,给银行 加了不必要的busy。但是我们依然可以绕过这个busy来用这个bug(不然当年我 也就不自称为“专玩mud,专找bug”的老柳了),这种情况一直持续到2001年, 这个bug才真正断了根。 (关于busy的问题,有一个最猛的提法,就是管他必要不必要,所有动作通 通加上busy,所有动作通通判断busy。。。这个说法很不幸也是从fy那边传来的) combine物件本身还存在另外一个问题。就是那些在初始就设置好amount的 东东。还记得风云里边黄麻子的骰子吗?(卖一个卖一个卖一个再存一个,取 出来又是81个)。。。。。 3。前后多次修改造成的问题。 一个mud的某一部分修改过多就难免造成问题,特别是底层。我猜最著名一 个就是xyj的skills bug了。那个bug我们在2000年的时候发现了,并且在xyj的总 站也用了一段时间。后来到了2001年,开始有巫师在一些论坛上谈到这个问题, 这个bug才真正被曝了光。不过似乎xyj那边也没有什么好的解决方法,而只是 把那些有问题的id屏蔽了事。(可惜可惜,多好的bug阿,啊) 4。判断不够仔细。 在古代,有一个阿凡提的故事。。。。最早流传的那份xkx里边有著名的毛驴 bug。原因就是没有判断这个毛驴是否玩家,我自己曾经在host的站上一个小时 刷出了300万经验。(爽啊。。。),其实,这类bug还有很多,我估计现在很 多从xkx来的mud里边还多少保留着一些,只不过不是很要命而已。(比如,少 林的达摩令,英雄令啊,月光宝盒什么的) 另外一个就是xyj的赌场bug。当然,xyj的赌场(不是现在在正式站跑的那个, 而是大家,嗯,D来的那个)有很多bug。关于把人变成公鸡来斗鸡的只是其中 一个而已。(说起来,变成水老鼠什么的好像大家都已经不当bug看了,怎么说 来的,这是一种功能:))) 5。lib组合bug。 这年头,把几个不相干的lib放在一起搞的人不多了。可是当年却不少啊。最 著名的就是98年的时候曙光的纵横I。由于把xkx和es2放在了一起,搞出了不少 搞笑经典。最著名的就是es2里边有个烟袋恢复神,而开始玩家是没法拿到老村 长身上的烟袋的,可惜,xkx里边有个丐帮。。。。结果读书就变成了玩笑了。 所以,我很慎重的提醒各位天神,在从别人的lib里边拿东西往自己的mud里 边放的时候,还是小心为好,不然一不小心就给自己摆个乌龙。 6。超级组合大bug。 这个类型也称经典,这就是我说的,小处都没问题,大处出毛病的例子。 想到这个类型,我就无法不想到fy系列。其实,fy系列的小bug并不多,除了 fy3的随意拿苍穹、乞丐无限死亡不掉begging、降头得无限钱、fy2的天堂马车 等等少数bug之外,剩下的也就是几个大bug了。 在fy2的时代,正循环还还是可行的,尸体也是可以烧来赚潜能和经验的,官 府也还是可以招大内高手的。本来这都没有什么。我猜坏就坏在黄麻子和尹正廉 住的太近的过,还有中间有个化尸堂。你想,当10个20个能正循环的官府dummy 招大内杀黄麻子。。。那产生尸体的数目是不是不是就。。。。 另外一个著名的bug就是寂识。本来,寂识基本不会成功。本来,磕头降悟 性也没有什么用。但是放在了一起,就把个好好的fy3搞惨了,再加上 player master的被允许。绝大部分fy站点开一段时间之后都会出现大批几千几万 级功夫的玩家,于是这个fy站就废了。 总结一下就是,es2把mud带给国人的同时,也把不少经典bug带进了各个 mud。xkx(早期版本)大bug不多,经典小bug无数(还有人有最早那份xkx吗, 别的不说,那个少林基本上是一步一个bug,无限吃puti zi、敲钟击鼓,石板丝 绢,总而言之就是有add_action就必有bug,没有add_action也能造出bug,就 比如那个活人出地狱); fy系列(fy4我没有玩过,不敢评论,不过据说前段被攻击了,导致系统不稳 定),小bug不太多,经典组合超级大bug不少。 xyj,大小bug兼而有之,而且都很有“社会主义特色”,比如之前都没有来得及 提到的赌场另外bug,坐骑无限加轻功,等等,也就没有什么了。 所以对于debug,我自己的一点看法就是,微观的细心加上宏观的控制,二 者缺一不可。要知道,玩家总比巫师聪明,而且巫师的思维定位在自己的模式 上,而玩家永远会从各种奇怪的角度去考虑问题。好吧,这个斗争将长期的进 行下去,阿门。 作者 akuma 转自 lywin bbs |
![]() |
![]() |