Short: Lexerbug in 3.2.4 Date: 981029 Type: Bug State: Fixed Author: Freaky Long: Lars Duening: > Ja, jetzt muesste ich nur etwas mehr Freizeit haben, um auch wirklich > regelmaessig dran arbeiten zu koennen :-) *grins* ich kenne das Problem. Ich kann fuer UNItopia auch nicht mehr das tun, was ich gerne tun wuerde. > > Ist die Versionsnummer eigentlich mit Amylaar abgesprochen? > > Nicht dass es irgendwann zwei Driver mit derselben Versions-Nummer gibt. > > Noe, weswegen ich das Teil ja auch 'LDMud' genannt habe. Aber das > Amylaar nochmal selber einen Patch herausgibt ist sehr unwahrscheinlich. Alles klar. > Danke fuer den Patch! No Prob. Allerdings habe ich ein Problem, bei dem ich nicht weiss, woran es liegt: Der Driver crashed ab und zu: #1 0x80608ee in yylex1 () at lex.c:1775 #2 0x805bb8b in yylex () at lex.c:1812 #3 0x804e7ee in yyparse () at y.tab.c:4866 #4 0x804e4ad in compile_file () at prolang.y:6940 #5 0x8083aff in load_object ( lname=0xbf81fff8 "z/Raetsel/Hackbart/d/Kokosinsel/room/gang1", dont_reset=0, depth=60) at simulate.c:419 #6 0x8083c7e in load_object ( lname=0xbf82018c "z/Raetsel/Hackbart/d/Kokosinsel/room/gang1", dont_reset=0, depth=60) at simulate.c:454 #7 0x8083c7e in load_object ( lname=0xbf820320 "z/Raetsel/Hackbart/d/Kokosinsel/room/gang1", dont_reset=0, depth=60) at simulate.c:454 #8 0x8083c7e in load_object ( lname=0xbf8204b4 "z/Raetsel/Hackbart/d/Kokosinsel/room/gang1", dont_reset=0, depth=60) at simulate.c:454 #9 0x8083c7e in load_object ( lname=0xbf820648 "z/Raetsel/Hackbart/d/Kokosinsel/room/gang1", dont_reset=0, depth=60) at simulate.c:454 #10 0x8083c7e in load_object ( lname=0xbf8207dc "z/Raetsel/Hackbart/d/Kokosinsel/room/gang1", dont_reset=0, depth=60) at simulate.c:454 .... (so geht das immer weiter) Er findet anscheinend das Objekt nicht im Object-Hash-Table und verhaspelt sich irgendwann. Ich weiss nur nicht, wie man das repariert. In deinem Changelog steht was drin, dass du den object-namen vorher neu zusammensetzt. Wenn ich das obige Objekt von Hand lade, crashed der Driver nicht, es muss also schon vorher einen Fehler im Hash-Table gegeben haben. Leider kenne ich mich mit den Internas des Drivers nicht gut genug aus, um einen Hash-Table zu debuggen. Vielleicht findest du den Fehler... Ciao Freaky -- Frank 'Freaky' Kirschner UNItopia Admin http://UNItopia.uni-stuttgart.de/ Freaky@UNItopia.Uni-Stuttgart.DE telnet://UNItopia.uni-stuttgart.de/ From: Freaky <Freaky@UNItopia.rus.uni-stuttgart.de> Date: Thu, 29 Oct 1998 16:48:07 +0100 X-Mailer: Mutt 0.94.10i Hi, Lars Duening: > > Lars Duning: > > > Ein paar Fragen hab ich doch noch. Ich wuerde gerne den Anfang > > > des Callstacks sehen, also die obersten Frames bis hin zum > > > Anfang der (fast)Endlosrekursion. > > > > Leider ist das Core unserem naechlichen Aufraeum-Crin zum Opfer gefallen :( > > Hab ich schon befuerchtet, aber ich wollte wenigstens gefragt haben. Ok.. ich habe es nochmal geschafft: Mudadm ~/orbit/lib > gdb ~/magyra/bin/driver-3.2.4.01 core GNU gdb 4.17 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux"... warning: core file may not match specified executable file. Core was generated by `/UNItopia/mudadm/orbit/bin/driver -DUNItopia -DTestMUD -DOrbit -E300000 -DMESSA'. Program terminated with signal 11, Segmentation fault. find_solib: Can't read pathname for load map: Input/output error #0 0x805d034 in _expand_define (p=0x9c87a4c) at lex.c:2404 2404 add_input(p->exps.str); (gdb) bt #0 0x805d034 in _expand_define (p=0x9c87a4c) at lex.c:2404 #1 0x80608ee in yylex1 () at lex.c:1775 #2 0x805bb8b in yylex () at lex.c:1812 #3 0x804e7ee in yyparse () at y.tab.c:4866 #4 0x804e4ad in compile_file () at prolang.y:6940 #5 0x8083aff in load_object ( lname=0xbf81fff8 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:419 #6 0x8083c7e in load_object ( lname=0xbf820188 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 #7 0x8083c7e in load_object ( lname=0xbf820318 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 #8 0x8083c7e in load_object ( lname=0xbf8204a8 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 #9 0x8083c7e in load_object ( lname=0xbf820638 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 #10 0x8083c7e in load_object ( lname=0xbf8207c8 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 [...] (gdb) list 2399 lexerror("Too many macro expansions"); 2400 return 0; 2401 } 2402 if (p->nargs == -1) { 2403 if (!p->special) { 2404 add_input(p->exps.str); 2405 } else { 2406 e = (*p->exps.fun)(); 2407 if (!e) { 2408 lexerror("Out of memory"); (gdb) up #1 0x80608ee in yylex1 () at lex.c:1775 1775 _expand_define(&p->u.define); (gdb) list 1770 printf("ident type is %d\n",p->type); 1771 #endif 1772 switch(p->type) { 1773 case I_TYPE_DEFINE: 1774 outp=yyp; 1775 _expand_define(&p->u.define); 1776 if (lex_fatal) { 1777 return -1; 1778 } 1779 yyp=outp; (gdb) up #2 0x805bb8b in yylex () at lex.c:1812 1812 r = yylex1(); (gdb) list 1807 int r; 1808 1809 #ifdef LEXDEBUG 1810 yytext[0] = 0; 1811 #endif 1812 r = yylex1(); 1813 #ifdef LEXDEBUG 1814 fprintf(stderr, "lex=%d(%s) ", r, yytext); 1815 #endif 1816 return r; (gdb) up #3 0x804e7ee in yyparse () at y.tab.c:4866 y.tab.c:4866: No such file or directory. (gdb) list y.tab.c:4861: No such file or directory. (gdb) up #4 0x804e4ad in compile_file () at prolang.y:6940 6940 yyparse(); (gdb) list 6935 /* 6936 * Compile an LPC file. 6937 */ 6938 void compile_file() { 6939 prolog(); 6940 yyparse(); 6941 epilog(); 6942 } 6943 6944 static char *get_two_types(type1, type2) (gdb) up #5 0x8083aff in load_object ( lname=0xbf81fff8 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:419 419 compile_file(); (gdb) list 414 /* The file name is needed before start_new_file(), in case there is 415 * an initial line too long error. 416 */ 417 start_new_file(fd); 418 name[name_length] = '\0'; 419 compile_file(); 420 end_new_file(); 421 if (comp_flag) 422 fprintf(stderr, " done\n"); 423 update_compile_av(total_lines); (gdb) up #6 0x8083c7e in load_object ( lname=0xbf820188 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 454 ob = load_object(name, dont_reset, depth); (gdb) list 449 free_string(inter_sp->u.string); 450 inter_sp--; 451 if (!ob || ob->flags & O_DESTRUCTED) 452 error("Inheritance failed\n"); 453 if ( !(ob = lookup_object_hash(name)) ) 454 ob = load_object(name, dont_reset, depth); 455 return ob; 456 } 457 if (num_parse_error > 0) { 458 error("Error in loading object\n"); [...] Was brauchst du sonst noch? Ciao Freaky -- Frank 'Freaky' Kirschner UNItopia Admin http://UNItopia.uni-stuttgart.de/ Freaky@UNItopia.Uni-Stuttgart.DE telnet://UNItopia.uni-stuttgart.de/ Subject: Re: Noch ein Bug From: Freaky <Freaky@UNItopia.rus.uni-stuttgart.de> Date: Fri, 30 Oct 1998 14:01:52 +0100 X-Mailer: Mutt 0.94.10i Hi, Lars Duening: > > Lars Duening: > > > > Ok.. ich habe es nochmal geschafft: > > > > > > Was ich jetzt noch gerne wissen wuerde, ist, wie Anfang des Callstacks > > > aussieht (in gdb die Frames mit den hohen Nummern), also bis hin zum > > > dritten Aufruf von load_object("d/Doerrland..."). Eventuell in diesen > > > drei load_object()-Aufrufen noch alle lokalen Variablen, die dir > > > interessant erscheinen. > > > > Wie kann ich die callstacks in den Frames anzeigen? > > Alle Frames zusammen bilden den Callstack, und ich will einfach nur das > andere Ende dieses Stacks sehen. Klar jetzt? Ich bin bisher noch nie an das Ende gestossen ;) #20625 0x8083c7e in load_object ( lname=0xbfffdab8 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 #20626 0x8083c7e in load_object ( lname=0xbfffdc48 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 #20627 0x8083c7e in load_object ( lname=0xbfffddd8 "d/Doerrland/Sarasande/bambule/bad/araum", dont_reset=0, depth=60) at simulate.c:454 #20628 0x8083c7e in load_object ( lname=0x9d4ef71 "d/Doerrland/Sarasande/bambule/bad/araum.c", dont_reset=0, depth=60) at simulate.c:454 #20629 0x8086ab4 in find_object ( str=0x9d4ef71 "d/Doerrland/Sarasande/bambule/bad/araum.c") at simulate.c:1988 #20630 0x806dbb0 in eval_instruction ( first_instruction=0x8de6ff3 "JyDSJz\037", sp=0x80e2578) at interpret.c:5929 #20631 0x807c6a9 in apply_low (fun=0x8e1c8fa "loading", ob=0x8bc4c8c, num_arg=1) at interpret.c:10185 #20632 0x807ca9c in sapply (fun=0x8e1c8fa "loading", ob=0x8bc4c8c, num_arg=1) at interpret.c:10351 #20633 0x807cb0a in apply (fun=0x8e1c8fa "loading", ob=0x8bc4c8c, num_arg=1) at interpret.c:10370 #20634 0x80ae33c in process_value ( str=0x9d52150 "loading:/w/freaky/obj/tobj|/d/Doerrland/Sarasande/bambule/bad/araum.c") at parse.c:1902 #20635 0x80ae1a1 in process_part ( str=0x9d52150 "loading:/w/freaky/obj/tobj|/d/Doerrland/Sarasande/bambule/bad /araum.c") at parse.c:1836 #20636 0x80adf88 in process_string ( str=0x9d60410 "@@loading:/w/freaky/obj/tobj|/d/Doerrland/Sarasande/bambule/bad/araum.c@@") at parse.c:1765 #20637 0x80720ad in eval_instruction (first_instruction=0x8645a5b ",", sp=0x80e2520) at interpret.c:7171 #20638 0x807c6a9 in apply_low (fun=0x879cafa "f_find", ob=0x8ddb03c, num_arg=8) at interpret.c:10185 #20639 0x807ca9c in sapply (fun=0x879cafa "f_find", ob=0x8ddb03c, num_arg=8) at interpret.c:10351 #20640 0x80ab70e in call_out () at call_out.c:402 #20641 0x808e31e in call_heart_beat () at backend.c:789 #20642 0x808dca7 in backend () at backend.c:482 #20643 0x8061404 in main (argc=24, argv=0xbffffa08) at main.c:313 Das process_string ist von Meinem Objekt, das einfach successive alle Objekte laedt (ein iterativer find in LPC der fuer jedes File einen String auswertet und per process_string ausfuehrt) /w/freaky/obj/tobj: string loading(string str) { string tt; tell_object(find_player("freaky"),sprintf("loading '%s'\n",str)); tt = catch(call_other(str,"???")); if (tt) tell_object(find_player("freaky"),sprintf("Fehler bei %s: %s",str,tt)); return ""; } Ciao Freaky -- Frank 'Freaky' Kirschner UNItopia Admin http://UNItopia.uni-stuttgart.de/ Freaky@UNItopia.Uni-Stuttgart.DE telnet://UNItopia.uni-stuttgart.de/