Hiya All
Finally, it seems I've nailed the problem down for crashing when editing
new rooms. (And this while I was looking for something else, funny eh? :)
It requires DG as first. Create a trigger that can be executed somewhat
controlled (a command trigger is nice):
-----
%echo% trigger is starting
wait 20s
%echo% trigger ended
-----
Now, Fire up the trigger and before the 20 seconds ends, edit a NEW room
(not one of the existing ones), wait for the crash (Or at least that is
what I've been able to deduce).
gdb shows:
Program received signal SIGSEGV, Segmentation fault.
0x80cc0c3 in script_driver (go=0x40161970, trig=0x85e44c0, type=2,
mode=1) at dg_scripts.c:2904
2904 if (!(sc = SCRIPT((struct room_data *) go))) {
(gdb) bt
#0 0x80cc0c3 in script_driver (go=0x40161970, trig=0x85e44c0, type=2,
mode=1) at dg_scripts.c:2904
#1 0x80c5fef in trig_wait_event (info=0x85e8380) at dg_scripts.c:489
#2 0x80c162d in process_events () at dg_event.c:80
#3 0x804a730 in heartbeat (pulse=1125) at comm.c:759
#4 0x804a6e9 in game_loop (mother_desc=6) at comm.c:742
#5 0x8049a89 in init_game (port=5000) at comm.c:296
#6 0x80499ee in main (argc=1, argv=0xbffffc74) at comm.c:263
#7 0x4005bcb3 in __libc_start_main (main=0x8049784 <main>, argc=1,
argv=0xbffffc74, init=0x8048fb8 <_init>, fini=0x80d2f64 <_fini>,
rtld_fini=0x4000a350 <_dl_fini>, stack_end=0xbffffc6c) at
../sysdeps/generic/libc-start.c:78
(gdb) print *sc
Cannot access memory at address 0x0.
(gdb) print sc
$1 = (struct script_data *) 0x0
(gdb) print *trig
$2 = {nr = 201, attach_type = 2 '\002', data_type = 0 '\000', name =
0x85e4490 "new trigger", trigger_type = 64, cmdlist = 0x81bce48,
curr_state = 0x81bcea8,
narg = 100, arglist = 0x0, depth = 1, loops = 0, wait_event = 0x0,
purged = 0 '\000', var_list = 0x85e4520, next = 0x0, next_in_world =
0x85e0088}
(gdb) print *go
Attempt to dereference a generic pointer.
(gdb) print go
$3 = (void *) 0x40161970
-----
(More information on request)
What I see as the problem is this:
Trigger starts and runs on the existing world. While rediting, the world
get's freed and everythign is reassigned (objs moved if needed and so on
:). Trigger reaches end of pause, and continues on a room that no longer
exist (It has been freed in the redit procedure), the result is a crash.
The code around where the crash occurs is:
File: dg_scripts.c
Function: int script_driver(void *go, trig_data *trig, int type, int mode)
case WLD_TRIGGER:
if (!(sc = SCRIPT((struct room_data *) go))) {
sprintf(buf,"SYSERR:No room(%d)->script in script_driver",
((struct room_data *) go)->number);
mudlog(buf,DEB,LVL_IMMORT,TRUE);
return FALSE;
}
break;
I'm going to dig deeper into this, but if anyone have the "Ah, that is
simply a matter of.." solution, I'd be more than happy to hear about it
:).
Friendly Greetings
Serces
"The Law of Self Sacrifice"
When you starve with a tiger, the tiger starves last.
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 04/10/01 PDT