背景:
阅读文章

bug与debug

[日期:2007-05-06] 来源:  作者:akuma [字体: ]

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,我自己的一点看法就是,微观的细心加上宏观的控制,二
者缺一不可。要知道,玩家总比巫师聪明,而且巫师的思维定位在自己的模式
上,而玩家永远会从各种奇怪的角度去考虑问题。好吧,这个斗争将长期的进
行下去,阿门。

尊重作者 转载请注明出处52mud.com

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论