作者laechan (小太保)
看板mud_sanc
标题[wizs] debug.log
时间Wed Jul 21 09:56:00 2010
Heart beat in /std/user#2 turned off.
执行时段错误: *Error in loading object '/d/skill/basesk'
程式: adm/daemons/fight_d.c:919
物件: /adm/daemons/fight_d
/std/user#3673 "heart_beat" std/user.c:951
/std/user#3673 "continue_attack" std/user.c:412
/adm/daemons/user_d "continue_attack" adm/daemons/user_d.c:1304
/adm/daemons/user_d "execute_attack" adm/daemons/user_d.c:1473
/adm/daemons/user_d "normal_attack" adm/daemons/user_d.c:1750
/adm/daemons/fight_d "defance" adm/daemons/fight_d.c:280
/adm/daemons/fight_d "dodge_defance" adm/daemons/fight_d.c:919
最近的一些无心跳案例应该都是由这个引起,大部份情况
下从 debug.log 都可以看到原因在哪。
919 行附近如下..
if(!mod=tar->query_temp("dodge"))
{
BASE_DEF->dodge(tar); <= 919
return "ERROR";
}
问题在於 BASE_DEF = /d/skill/basesk.c 无法载入,它
的发生原因对照现况来说的确是可能的。
不过也要请 hlead or quest 回忆一下最近是否有撰写会
动到玩家or怪物的 temp_data["dodge"] 栏位的东西,或
者是否有更动 /d/skill/basesk.c。
今已将 /d/skill/basesk.c 纳入 preload 体系,更动档
案为 /adm/etc/preload, quest 可参照。原则上被纳入
preload 的档案将由系统本身做 upload 的动作。
执行时段错误: *Array index out of bounds.
程式: d/ppl/wide/virtue/event/control.c:62
物件: /d/ppl/wide/virtue/event/control
/d/ppl/wide/virtue/event/control "event_1" d/ppl/wide/virtue/event/control.c:62
int event_1(int s)
{
object rooms;
int i;
if(s>6) return 1;
for(i=0;i<6;i++)
{
rooms=find_object_or_load(TENGU_PATH+room[s][i]); <=- 第 62 行
room 是一个 4x9 的二维阵列,所以 s 不能大於 3,上面的
if(s>6) 应为误判,已顺手先更正避免 bug 重覆发生。
执行时段错误: *Bad argument 1 to userp()
Expected: object Got: 1.
程式: cmds/std/_holybell.c:71
物件: /cmds/std/_holybell
/std/user#1078 "cmd_hook" std/user.c:295
/cmds/std/_holybell "cmd_holybell" cmds/std/_holybell.c:71
ob->set_temp("holybell_times",t);
if(userp(ob))
{
if(ob->query_temp("holybell_check")<check)
{
ob->set_temp("holybell_check",check);
if(ob->query_temp("shield2"))
tell_object(ob,HIG"你的护盾受到圣洁铃音的强化, 变得更加坚固了!!\n"NOR);
}
if(ob->query("block_command")>0)
{
if(env=ob->query_current_attacker() && !userp(env)) <= 第71行
{
ob->delete("block_command");
ob->delete("block_command_msg");
tell_object(ob,HIM"你的定身状态被圣洁铃音解除了!!\n"NOR);
}
}
}
这跟上次 justin 遇到的 bug 类似,使用 && 或 ||
判定时,理论上若 if(env=ob->query_current_attacker() 先成立
,则後面的 userp(env) 就不应再判断到 no env 的情况。
但实际上却有上述情况发生。
上面已改为两段式判断..
if(env=ob->query_current_attacker())
{
if(!userp(env))
{
ob->delete("block_command");
ob->delete("block_command_msg");
tell_object(ob,HIM"你的定身状态被圣洁铃音解除了!!\n"NOR);
}
}
执行时段错误: *Bad argument 1 to call_other()
Expected: string or array or object Got: 0.
程式: u/l/laechan/special/mob/fingerwind1.c:108
物件: 0
/std/user#6292 "heart_beat" std/user.c:950
/std/user#6292 "force_me" std/user/body.c:90
/std/user#6292 "cmd_hook" std/user.c:295
/cmds/std/_force "cmd_force" cmds/std/_force.c:226
/d/force/phantom-strike "start_skill" d/force/phantom-strike.c:188
/std/user#6292 "shut" std/user/attack.c:142
/adm/daemons/shut_d "shut_tar" adm/daemons/shut_d.c:295
/adm/obj/simul_efun "show" adm/simul_efun/show.c(adm/obj/simul_efun.c):229
0 "receive_damage" std/mob/attack.c:29
0 "die" u/l/laechan/special/mob/fingerwind1.c:108
这是由 hmml 指称的 fingerwind 问题。
但问题在於 laechan 已经於先前针对该 bug 做过补正
/std/mob/attack.c
if ( data["hp"] < 0
&& me)
me->die();
也就是说必须要有 me,它才会做 me->die() 的动作,
但即便如此仍被判断到 0->die() 的情况。
上面同样改成两段式。
不过由於是 fingerwind 的错误,或许有其它原因也说
不定。
执行时段错误: *Bad argument 1 to call_other()
Expected: string or array or object Got: 0.
程式: d/crazy/6/room/015.c:90
物件: /d/crazy/6/room/015
/d/crazy/6/room/015 "relife_over" d/crazy/6/room/015.c:90
corpse->remove();
我猜是 relife 过程中 corpse 因故消失,已加上判断
式避免此错误。
执行时段错误: *Value being indexed is zero.
程式: d/force/deadly-shiv.c:110
物件: /d/force/deadly-shiv
/std/user#53760 "cmd_hook" std/user.c:295
/cmds/std/_force "cmd_force" cmds/std/_force.c:226
/d/force/deadly-shiv "start_skill" d/force/deadly-shiv.c:110
我猜该错误应该修补了(因为 110 行看到的已非上述错误段)
([ /* sizeof() == 7 */
"line" : 49,
"object" : 0,
"function" : "special_fun",
"arguments" : ({ /* sizeof() == 2 */
0,
/std/user#6424
}),
"file" : "d/ppl/laechan/圣魔大战/yaria1.c",
"locals" : ({ /* sizeof() == 3 */
3,
16,
({ /* sizeof() == 16 */
/std/user#6500,
/std/user#6424,
/std/user#5970,
/std/user#5056,
/std/user#6061,
/d/ppl/laechan/圣魔大战/soldier1#201011,
/d/ppl/laechan/圣魔大战/soldier1#201010,
/d/ppl/laechan/圣魔大战/soldier1#201009,
/d/ppl/laechan/圣魔大战/soldier1#201008,
/d/ppl/laechan/圣魔大战/mage1#201007,
/d/ppl/laechan/圣魔大战/mage1#201006,
/d/ppl/laechan/圣魔大战/mage1#201004,
/d/ppl/laechan/圣魔大战/priest1#201003,
/d/ppl/laechan/圣魔大战/priest1#201002,
0,
/d/ppl/laechan/圣魔大战/door1#201000
})
}),
"program" : "d/ppl/laechan/圣魔大战/yaria1.c",
])
}),
"program" : "d/ppl/laechan/圣魔大战/yaria1.c",
]),0)
obs=all_inventory(environment(frog));
j=sizeof(obs);
for(i=0;i<j;i++)
{
if(!obs[i]) continue;
if(!living(obs[i])) continue;
if(obs[i]->query("inchora")) continue;
frog->shut(HIM"神风"HIM"凤激斩"NOR,100000+random(100),10000,"dam",obs[i]);
}
上面已改成 foreach 写法,可避免掉一些问题。
物件: /cmds/std/_checking
/std/user#49923 "cmd_hook" std/user.c:295
/cmds/std/_checking "cmd_checking" cmds/std/_checking.c:444
if(wizardp(usr[i]) || usr[i]->query("no_checking") || usr[i]->query(kkk)<1)
上面 usr[i]->query(kkk)<1 的部份出问题,原因不明。
if(kkk!="@@count_damage" && kkk!="@@skill_num")
{
for(i=0;i<j;i++)
{
if(!usr[i]) continue;
if(wizardp(usr[i]) || usr[i]->query("no_checking") || usr[i]->query(kkk)<1)
continue;
usr2+=({usr[i]});
}
}
上面已增加一行判断..
if(!usr[i]) continue;
if(!intp(usr[i]->query(kkk))) continue;
if(wizardp(usr[i]) || usr[i]->query("no_checking") || usr[i]->query(kkk)<1)
避免它的下一行的 <1 判断错误。
本来还要加 log 的...因为这 bug 不只出现一次,加 log
就可以知道是谁执行该指令造成错误。
执行时段错误: *Bad argument 1 to call_other()
Expected: string or array or object Got: 0.
程式: adm/daemons/party_d.c:439
物件: /adm/daemons/party_d
/std/user#68076 "cmd_hook" std/user.c:295
/cmds/std/_party "cmd_party" cmds/std/_party.c:831
/cmds/std/_party "handle_kill" cmds/std/_party.c:114
/adm/daemons/party_d "party_kill" adm/daemons/party_d.c:439
这是 party kill 时发生的错误。
该 bug 已加上补强判断。
全系统於 2010/07/21 10:00am 早上实施 shutdown,下午
我会再观察一次 debug.log,将剩余的 bug 解决。
Belldandy.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.225.161.22
1F:→ laechan :顺手做了全系统备份. 以後 shutdown 时有想到都会做 07/21 10:15
2F:→ nahceal :然後nahceal就掉eq了XD 07/21 12:06
3F:→ nahceal :quest已补 3Q 07/21 12:21