Re: Memory issues.

"Valnir" <[email protected]>
Newsgroups gmane.games.devel.mud.rom
Message-ID <[email protected]>
Yeah, I noticed when I tried it.. hehe

One question though.. I tried the "char *temp;" and "free_string(temp);" 
thing in the Skill section of fread_char and it came back with "[*****] BUG: 
Attempt to recycle invalid memory of size 4." and "[*****] BUG: axe". Any 
thoughts?

            if ( !str_cmp( word, "Skill" ) || !str_cmp(word,"Sk") )
            {
                int sn;
                int value = fread_number( fp );
                char *temp = fread_word( fp );

                sn = skill_lookup(temp);

                if ( sn < 0 )
                {
                    sprintf(buf, "Fread_char: unknown skill - %s",temp);
                    bug( buf, 0 );
                }
                else
                    ch->pcdata->learned[sn] = value;

                free_string(temp);
                fMatch = TRUE;
            }


- Valnir

----- Original Message ----- 
From: "Michael Barton" <[email protected]>
To: <[email protected]>
Sent: Thursday, April 07, 2005 10:03 AM
Subject: Re: Memory issues.


> 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:
>> >> >> loa@pts/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
>>
> -- 
> 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.