I am having a problem with a crash-bug here. It happens when an object is extracted via the 'R' zone command for removing an object. I can purge and junk objects just fine, but as soon as the game tries to remove one, it crashes... Here is the gdb and code. GDB OUTPUT: Core was generated by `bin/spear -q 1066'. Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/libc.so.5...done. Reading symbols from /lib/ld-linux.so.1...done. #0 0x807a6ec in extract_obj (obj=0x81338a0) at handler.c:828 828 while (temp && (temp->next != obj)) (gdb) bt #0 0x807a6ec in extract_obj (obj=0x81338a0) at handler.c:828 #1 0x80748a5 in reset_zone (zone=1) at db.c:1999 #2 0x8063f9f in do_zreset (ch=0x8134270, argument=0xbffff9f8 " .", cmd=456, subcmd=0) at act.wizard.c:1980 #3 0x807c265 in command_interpreter (ch=0x8134270, argument=0xbffff9f4 "zres .") at interpreter.c:922 #4 0x806d5c4 in game_loop (mother_desc=3) at comm.c:606 #5 0x806cd18 in init_game (port=1066) at comm.c:237 #6 0x806cca7 in main (argc=3, argv=0xbffffe58) at comm.c:207 #7 0x80493fe in _start () (gdb) p temp->next Cannot access memory at address 0x290813d8. (gdb) p temp $1 = (struct obj_data *) 0x29081338 (gdb) p temp->name Cannot access memory at address 0x290813ac. (gdb) quit Notice that temp->next is unaccessable for some reason. Look at the code and tell me if you can spot why... /* Extract an object from the world */ void extract_obj(struct obj_data * obj) { struct obj_data *temp; if (obj->worn_by != NULL) if (unequip_char(obj->worn_by, obj->worn_on) != obj) log("SYSERR: Inconsistent worn_by and worn_on pointers!!"); if (obj->in_room != NOWHERE) obj_from_room(obj); else if (obj->carried_by) obj_from_char(obj); else if (obj->in_obj) obj_from_obj(obj); /* Get rid of the contents of the object, as well. */ while (obj->contains) extract_obj(obj->contains); /* BEGIN REMOVE_FROM_LIST */ if (obj == object_list) object_list = obj->next; else { temp = object_list; while (temp && (temp->next != obj)) temp = temp->next; if (temp) temp->next = obj->next; } /* END REMOVE_FROM_LIST */ /* REMOVE_FROM_LIST(obj, object_list, next); */ if (GET_OBJ_RNUM(obj) >= 0) (obj_index[GET_OBJ_RNUM(obj)].number)--; free_obj(obj); } I commented out the REMOVE_FROM_LIST macro call because the crash was happening on one of the lines of that macro and I wanted to be able to see which one. As you can tell (from gdb), it's the while loop call that is choking. Any insight is helpful... Even if it's a stupid mistake. :) Thanks, John Evans <evansj@hi-line.net> May the source be with you. +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/08/00 PST