No, this won't work.  fread_string allocates a string and returns it,
so you'll still need to free it.  You could write a function to read
in a string and return in a static buffer instead of an allocated
string, but I don't know if it'll be all that useful.

On Apr 7, 2005 8:24 AM, Valnir <[EMAIL PROTECTED]> wrote:
> Would it work just as well to do like the following?
> 
> if ( !str_cmp(word,"Clan") )
> {
>     char name[MIL] = fread_string(fp);
>     ch->clan = clan_lookup(name);
>     fMatch = TRUE;
>     break;
> }
> 
> That way it only allocates to a stack variable, and you have no need to free
> anything afterwards.
> 
> - Valnir
> 
> ----- Original Message -----
> From: "Michael Barton" <[EMAIL PROTECTED]>
> To: <[email protected]>
> Sent: Thursday, April 07, 2005 7:03 AM
> Subject: Re: Memory issues.
> 
> > Mine went something like this...
> >            if (!strcasecmp(word, "Clan"))
> >            {
> >              char *temp = fread_string(fp);
> >              ch->clan = clan_lookup(temp);
> >              free_string(temp);
> >              fMatch = TRUE;
> >              break;
> >            }
> >
> > Also this one needs fixing:
> >            KEY( "Race",        ch->race,
> >                                race_lookup(fread_string( fp )) );
> >
> > And any others that use fread_string should probably use the KEYS
> > macro instead of the KEY macro.  They aren't necessarily memory leaks,
> > but KEYS is a backup to help prevent them.  Example:
> > -             KEY( "Desc",       pet->description,
> > fread_string(fp));
> > +             KEYS( "Desc",       pet->description,
> > fread_string(fp));
> >
> >
> >
> > On Apr 7, 2005 5:33 AM, Valnir <[EMAIL PROTECTED]> wrote:
> >> Holy crap!
> >>
> >> And this is why I fully admit to the fact that I am still learning, and
> >> don't know a lot about the memory process.
> >>
> >> We had several items (in free_char, free_note, and free_pcdata) that
> >> where
> >> not being freed, including material.
> >>
> >> Guess I need to go check free_obj too, now that I'm thinking about it.
> >>
> >> That in itself should help the memory growth GREATLY. Thanks for pointing
> >> that out.
> >>
> >> So on the topic of "KEY( "Clan",        ch->clan,
> >> clan_lookup(fread_string(fp)));", what do you suggest to do with this
> >> line?
> >>
> >> - Valnir
> >>
> >> ----- Original Message -----
> >> From: "Michael Barton" <[EMAIL PROTECTED]>
> >> To: <[email protected]>
> >> Sent: Wednesday, April 06, 2005 12:46 PM
> >> Subject: Re: Memory issues.
> >>
> >> > Yeah.
> >> > The memory usage going up during a fight may not mean much, it could
> >> > have just been an area resetting or something.  I'd go the gdb route
> >> > too, it's more better.
> >> >
> >> > And you'll want to play the game for a bit before you do it.. make
> >> > sure all the areas are fully reset, kill a few mobs, etc.  Basically
> >> > try and build up a pool of free memory so no new allocations should be
> >> > happening.
> >> >
> >> > You should make sure all the known stock problems are taken care of.
> >> >
> >> > Like off the top of my head, ch->material isn't freed in free_char and
> >> > it should be.
> >> >
> >> > Then from save.c, fread_string returns an allocated string and this
> >> > just throws it away.
> >> >            KEY( "Clan",        ch->clan,
> >> > clan_lookup(fread_string(fp)));
> >> >
> >> > Has anyone made a list of these?
> >> >
> >> > --Palrich.
> >> >
> >> > On Apr 6, 2005 11:17 AM, Richard Lindsey <[EMAIL PROTECTED]> wrote:
> >> >> Ok, well the explanation for attaching to the process is below, but
> >> >> I'll
> >> >> restate it along w/ what you should do for monitoring memory
> >> >> allocation,
> >> >> and I'll refer you to my gdb tutorial on frostmud.com again :D
> >> >>
> >> >> From the shell, do a "ps ux" or "ps -ux", depending on your flavor of
> >> >> Linux... you'll get output similar to the following:
> >> >>
> >> >> USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
> >> >> loa      27648  0.0  0.1  5108 1164 ?        S    Mar26   0:00
> >> >> /bin/csh
> >> >> -f ./test 9001
> >> >> loa      27650  0.3  0.8 14488 8336 ?        S    Mar26  56:22
> >> >> ../src/rom 9001
> >> >> loa      27651  0.0  0.1 10808 1288 ?        S    Mar26   0:00
> >> >> aspell -a
> >> >> loa      27286  0.1  0.2  8316 2260 ?        S    12:11   0:00 sshd:
> >> >> [EMAIL PROTECTED]/457
> >> >> loa      27287  0.2  0.1  6272 1360 pts/457  S    12:11   0:00 -bash
> >> >> loa      27360  0.0  0.0  3728  744 pts/457  R    12:11   0:00 ps ux
> >> >>
> >> >> The column labeled PID is where you want to focus, find the PID for
> >> >> the
> >> >> line that has your executable running, in this case it's the line that
> >> >> says ../src/rom 9001, so the PID is 27650...
> >> >>
> >> >> Then, cd into that directory and type this:
> >> >>
> >> >> gdb ./rom 27650
> >> >>
> >> >> That will load gdb and attach it to your running mud's process... once
> >> >> inside, type this:
> >> >>
> >> >> watch nAllocPerm
> >> >> continue
> >> >>
> >> >> that will set a watchpoint for nAllocPerm, which is the internal
> >> >> variable that ROM uses for tracking how many permanent memory blocks
> >> >> it's allocated, and it's case sensitive... the continue tells the mud
> >> >> to
> >> >> start executing again, as it gets paused when gdb is first loaded...
> >> >> now
> >> >> flip over to your mud window again and get into a fight with a mob...
> >> >> when the game freezes, flip back over to your shell window, gdb should
> >> >> be showing a line like so:
> >> >>
> >> >> Hardware watchpoint 1: nAllocPerm
> >> >>
> >> >> Old value = 71918
> >> >> New value = 71919
> >> >> alloc_perm (sMem=36) at db.c:3263
> >> >> 3263        sAllocPerm += sMem;
> >> >> (gdb)
> >> >>
> >> >> that's where the mud is assigning a new chunk of memory, now type 'bt'
> >> >> to get a backtrace...
> >> >>
> >> >> #0  alloc_perm (sMem=36) at db.c:3263
> >> >> #1  0x080e9261 in new_note () at recycle.c:152
> >> >> #2  0x080d1792 in note_attach (ch=0xf6b32798, type=-156028424) at
> >> >> note.c:509
> >> >> #3  0x080d2940 in parse_note (ch=0xf6b32798, argument=0xfeed7828
> >> >> "all",
> >> >> type=0) at note.c:1107
> >> >> #4  0x080d1259 in do_note (ch=0xf6b32798, argument=0xfeed7825 "to
> >> >> all")
> >> >> at note.c:122
> >> >> #5  0x080b7d1b in interpret (ch=0xf6b32798, argument=0xfeed7825 "to
> >> >> all") at interp.c:725
> >> >> #6  0x08080c32 in substitute_alias (d=0xf6b2b21c, argument=0xfeed7820
> >> >> "note to all") at alias.c:125
> >> >> #7  0x08090b11 in game_loop_unix (control=4) at comm.c:880
> >> >> #8  0x0809056c in main (argc=2, argv=0xfeedb2f4) at comm.c:659
> >> >>
> >> >> in my case, I just went into my mud and did a 'note to all' which has
> >> >> to
> >> >> allocate new memory for the note_data... you can see in frame 1 where
> >> >> it
> >> >> calls new_note()... you'll want to follow this same set of steps on
> >> >> yours, and try to find where it's calling for more memory... when
> >> >> you're
> >> >> done looking, you can type continue, and the mud will keep going
> >> >> again,
> >> >> and stop on the next time new memory is being allocated... you may
> >> >> want
> >> >> to capture a few instances of those backtraces (only the first few
> >> >> lines
> >> >> of them, sometimes it can be spammy :D) and post the output here,
> >> >> along
> >> >> w/ a description of what you were doing at the time, fighting or
> >> >> whatever... when you're ready to get back out of gdb and let the mud
> >> >> run
> >> >> normally, just type q at a gdb prompt and you'll see something like
> >> >> this:
> >> >>
> >> >> The program is running.  Quit anyway (and detach it)? (y or n) y
> >> >> Detaching from program: /home/loa/test/Rom24/src/rom, process 27650
> >> >>
> >> >> Richard Lindsey.
> >> >>
> >> >> -----Original Message-----
> >> >> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Valnir
> >> >> Sent: Wednesday, April 06, 2005 11:07 AM
> >> >> To: [email protected]
> >> >> Subject: Re: Memory issues.
> >> >>
> >> >> Ok.. because I'm GDB ignorant, could you explain how to attach it to a
> >> >> running process, and how to monitor stuff? When it come to GDB I know
> >> >> two
> >> >> things.. "gdb -c core ../src/rom" and "where" once I'm inside.
> >> >>
> >> >> Thanks a million!
> >> >>
> >> >> - V
> >> >>
> >> >> ----- Original Message -----
> >> >> From: "Richard Lindsey" <[EMAIL PROTECTED]>
> >> >> To: "Valnir" <[EMAIL PROTECTED]>; <[email protected]>
> >> >> Sent: Wednesday, April 06, 2005 11:17 AM
> >> >> Subject: RE: Memory issues.
> >> >>
> >> >> In that case it could be something in your output during combat that's
> >> >> allocating a string and not freeing it, and those would add up w/ each
> >> >> battle round... try attaching gdb and monitoring nAllocPerm and see
> >> >> when
> >> >> it goes up, then backtrace and find out why, feel free to post some
> >> >> gdb
> >> >> output here if you want, but if you do, try to include it from a few
> >> >> separate instances of nAllocPerm increasing, so we can see if it's
> >> >> from
> >> >> 1 common cause or perhaps multiple...
> >> >>
> >> >> Richard Lindsey.
> >> >>
> >> >> -----Original Message-----
> >> >> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Valnir
> >> >> Sent: Wednesday, April 06, 2005 10:15 AM
> >> >> To: [email protected]
> >> >> Subject: Re: Memory issues.
> >> >>
> >> >> While I understand the point of new objects, re-pops, etc.. the mem
> >> >> when
> >> >> up
> >> >> DURING the fight, not a big jump AFTER.
> >> >>
> >> >> - V
> >> >>
> >> >> ----- Original Message -----
> >> >> From: "Richard Lindsey" <[EMAIL PROTECTED]>
> >> >> To: "Valnir" <[EMAIL PROTECTED]>; <[email protected]>
> >> >> Sent: Wednesday, April 06, 2005 11:07 AM
> >> >> Subject: RE: Memory issues.
> >> >>
> >> >> Well, it would be creating a new instance of an object or objects (the
> >> >> mob's corpse and any coins it had, possibly dropped body parts), so
> >> >> that
> >> >> could possibly cause it... I forgot to tell you how to attach gdb to a
> >> >> running process earlier after you started using splint, but you can
> >> >> use
> >> >> gdb to set a watchpoint for nAllocPerm and see when it's incrementing,
> >> >> then trace back to see why... to attach to a running process, you can
> >> >> either do it at boot time or while the game is running like so:
> >> >>
> >> >> At boot time:
> >> >>
> >> >> cd into your area directory and do the following:
> >> >>
> >> >> gdb ../src/rom (or whatever your executable is named)
> >> >> run 7777 (or whatever your port # is)
> >> >>
> >> >> During run time:
> >> >>
> >> >> Cd into your src directory and do the following:
> >> >>
> >> >> ps -ux (get the PID of the mud's process, we'll use 12345 for this
> >> >> example)
> >> >> gdb ./rom 12345 (or whatever your executable is named)
> >> >> continue
> >> >>
> >> >> when you attach to the running process it will pause the mud, so you
> >> >> need to continue to set it in motion again, and you'll probably want
> >> >> to
> >> >> set your watchpoint(s) before doing so... you can hit ^C while the
> >> >> game
> >> >> is running, and it'll pause the game and give you a prompt to work
> >> >> with
> >> >> in gdb...
> >> >>
> >> >> I wrote a little faq/tutorial for some of the more common gdb usage on
> >> >> frostmud.com a while back, it's pretty decent with lots of examples...
> >> >> I
> >> >> was going to post the url straight to it in this message, but when I
> >> >> went to get it, I haven't logged in for so long my forum acct got
> >> >> wiped,
> >> >> and I'm too lazy to recreate it right now :D so if you want to go to
> >> >> frostmud.com and click on the forum link, register, and go into the
> >> >> Help
> >> >> section, there should be one from Velveeta about a gdb tutorial (you
> >> >> may
> >> >> have to set the date to show up a bit, some of those php boards only
> >> >> show from the last 30 days by default, and this was made sometime last
> >> >> year)... hope it helps...
> >> >>
> >> >> Richard Lindsey.
> >> >>
> >> >> -----Original Message-----
> >> >> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Valnir
> >> >> Sent: Wednesday, April 06, 2005 10:01 AM
> >> >> To: [email protected]
> >> >> Subject: Re: Memory issues.
> >> >>
> >> >> Ok.. maybe this will help to point where a lot of memory leaks are.
> >> >>
> >> >> I opened up a duplicate copy of my mud on our dev port and logged in.
> >> >> While
> >> >> running "top" at the shell, to watch the mem usage of the process, I
> >> >> went
> >> >> and killed one of our high level mobs, using mortal weapons and
> >> >> spells.
> >> >>
> >> >> Mem Usage Before Fight: 10460k
> >> >> Mem Usage After Fight: 10580k
> >> >>
> >> >> Now mind you, I am the ONLY one logged in there. Any thoughts?
> >> >>
> >> >> - Valnir
> >> >>
> >> >> ----- Original Message -----
> >> >> From: "Michael Barton" <[EMAIL PROTECTED]>
> >> >> To: <[email protected]>
> >> >> Sent: Wednesday, April 06, 2005 10:19 AM
> >> >> Subject: Re: Memory issues.
> >> >>
> >> >> >> #3  0x486d176d in sprintf () from /lib/libc.so.6
> >> >> >> #4  0x0807127e in do_mstat (ch=0x4956017c, argument=0x487afd24
> >> >> "8,\023")
> >> >> >> at
> >> >> >> act_wiz.c:2143
> >> >> >
> >> >> > The problem's probably with a call to sprintf on that line in
> >> >> > act_wiz.
> >> >> > Look at the buffer size and how much is being copied into it, make
> >> >> > sure none of the arguments are uninitialized (might contain junk
> >> >> > data
> >> >> > that never has a terminator).
> >> >> > Consider using snprintf instead of sprintf, since it shouldn't write
> >> >> > over the buffer if used correctly.
> >> >> >
> >> >> > What happens is, sprintf will gladly copy more into the buffer than
> >> >> > it
> >> >> > can hold.  The buffer sits in memory right next to where the
> >> >> > arguments
> >> >> > are stored (in the "stack"), so they get written over once sprintf
> >> >> > has
> >> >> > gone beyond the buffer.  So your arguments basically contain junk
> >> >> > now.
> >> >> > So the memory's corrupt, and that's all gdb has when it goes to drop
> >> >> > a core.
> >> >> >
> >> >> >> act_comm.c:108:48: New fresh storage (type char *) passed as
> >> >> implicitly
> >> >> >> temp
> >> >> >>                       (not released): capitalize(ch->name)
> >> >> >>   A memory leak has been detected. Storage allocated locally is not
> >> >> >> released
> >> >> >>   before the last reference to it is lost. (Use -mustfreefresh to
> >> >> inhibit
> >> >> >>   warning)
> >> >> >
> >> >> > Take everything splint tells you with a grain of salt. :)
> >> >> > It's not super smart, it's just looking for things that
> >> >> > statistically
> >> >> > often cause problems.  Use it to find areas of the game to double
> >> >> > check.
> >> >> >
> >> >> > --Palrich.
> >> >> > --
> >> >> > ROM mailing list
> >> >> > [email protected]
> >> >> > Unsubscribe here ->>>
> >> >> > http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >> >> >
> >> >>
> >> >> --
> >> >> ROM mailing list
> >> >> [email protected]
> >> >> Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >> >>
> >> >> --
> >> >> ROM mailing list
> >> >> [email protected]
> >> >> Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >> >>
> >> >> --
> >> >> ROM mailing list
> >> >> [email protected]
> >> >> Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >> >> --
> >> >> ROM mailing list
> >> >> [email protected]
> >> >> Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >> >>
> >> > --
> >> > ROM mailing list
> >> > [email protected]
> >> > Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >> >
> >>
> >> --
> >> ROM mailing list
> >> [email protected]
> >> Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >>
> > --
> > ROM mailing list
> > [email protected]
> > Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> >
> 
> --
> ROM mailing list
> [email protected]
> Unsubscribe here ->>> http://www.rom.org/cgi-bin/mailman/listinfo/rom
>

Reply via email to