Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Memory Leak hunting

[es] :: Pascal / Delphi / Kylix :: Memory Leak hunting

[ Pregleda: 3118 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

burex
46°05'N 19°39'E

Član broj: 24964
Poruke: 987
*.verat.net.



+679 Profil

icon Memory Leak hunting04.11.2004. u 12:39 - pre 236 meseci
Pravim jedan program za VoIP komunikaciju, i do sada je sve islo OK, sve do trenutka kada sam pritisnuo CTRL+ALT+DEL i primetio da mi program zdere 40-50KB memorije u sekundi!!!

Negde postoji memory leak, ali ne verujem da je u komponentama koje koristim jer ako ih sve postavim u novi projekat ne izazivaju povecano trosenje memorije.

Ima li predloga kako da udjem u trag kodu koji izaziva ovaj memory leak?

PS: Velik je source, pa bas ne mogu da lagano pregledam ceo kod u potrazi za greskom...
A man is smart. People are stupid.
 
Odgovor na temu

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.ptt.yu.



+1 Profil

icon Re: Memory Leak hunting04.11.2004. u 16:58 - pre 236 meseci
Ako potrosnja memorije konstantno raste, znaci da negde periodicno alociras memoriju koju kasnije ne dealociras. Ne verujem da ima mnogo takvih mesta u tvom delu koda. Napravi brojac, nadji mesto gde alociras memoriju i tu povecavaj brojac. Tamo gde dealociras taj tip promenljive/klase umanjuj brojac. Idi redom, po tipovima alocirane memorije (objekti, pointeri), kad tad naci ces situaciju da brojac konstantno raste i onda samo treba da utvrdis zasto ne dolazi do dealokacije. Mozes i da prikazes brojac negde na glavnom prozoru da ne moras da trejsujes.
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.149.eunet.yu.



+1 Profil

icon Re: Memory Leak hunting04.11.2004. u 20:47 - pre 236 meseci
Ako se potrosnja desava tako brzo kako si rekao znaci da se desava u nekom delu koda koji se izvrsava cesto (prihvatanje-slanje podataka?), tako da treba odmah da ogranicis pretragu na taj deo koda.

Prekontrolisi oslobadjanje memorije, znaci da svaki create ima i odgovarajuci free.

Ako koristis niti prekontrolisi da li si stavio FreeOnTerminate (naravno ako ima smisla u kontekstu tvog programa).

Ako imas neke svoje klase koje nesto nasledjuju proveri da li si kod Destroy-a stavio override.

Mozda si negde zaboravio try...finally, a dolazi do nekog cestog dizanja exception-a pa se ne izvrsava kod za oslobadjanje resursa.

@Milos D: Mislim da je ovaj metod sa brojacem ipak pretezak za implementaciju u postojeci projekat koji je uz to i velik (kako kaze burex).
 
Odgovor na temu

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.ptt.yu.



+1 Profil

icon Re: Memory Leak hunting05.11.2004. u 10:47 - pre 236 meseci
Dobro, ja sam (mozda pogresno) pretpostavio da je on vec probao sve drugo, ukljucujuci i ono sto si predlozio. Uostalom, vidis po ikonici da je besan Postupak sa brojacem ima dve dobre strane
1. ne zahteva bas mnogo razmisljanja (ja kad popizdim mozak mi radi jos gore nego inace pa mi to dobro dodje). Tamo gde alociras stavis
INC(counter); If counter>Sumnjivi_Broj then showmessage...
i tamo gde dealociras stavis DEC(counter) i kraj price. Ne znam koliki je to kod, ali ne mogu da verujem da ima vise od 20 objekata koji se cesto alociraju/dealociraju. Znaci, po mojoj proceni za 10 minuta uz copy/paste moze komotno da utvrdi koji pravi probleme.
2. 100% si siguran da ces naci tacno koji objekat/pointer stvara memory leak, a to ne mozes biti siguran da ces naci gledajuci kod, pogotovo ako je velik i komplikovan. Imao sam slucaj sa parsiranjem, tokeni (reci) su bile objekti i u nekom ogromnom konacnom automatu su se setale i presipale iz jedne liste u drugu, i jos povrh svega kod nije bio moj... I, dobro mi je doslo koriscenje countera.
 
Odgovor na temu

burex
46°05'N 19°39'E

Član broj: 24964
Poruke: 987
217.26.66.*



+679 Profil

icon Re: Memory Leak hunting05.11.2004. u 13:29 - pre 236 meseci
Argh! Sad sam jos vise besan!

Misterija stoji u tome: KOOO je ugasio Range i Overflow checking?????

Prihvatio sam tvoj savet Milose i eto (zasucem rukave, ispucam prste)... Opalim jedan Count:Integer; promenljivu, napravim procedure:

Code:

procedure Add1;
begin
Count := Count+1;
Form1.Label17.Caption := IntToStr(Count);
end;

procedure Rem1;
begin
Count := Count-1;
Form1.Label17.Caption := IntToStr(Count);
end;


Stavim tamo gde se nalaze one uobicajene radnje Bla := TBla.Create;...

Postavim ja tako 10 procedura Add1 i 10 procedura Rem1, i kada se pomirim s time da je rezultat 0 i da cu jos morati da cupam kosu oko ovog problema, pokrenem program, a Label17 koji sam stavio na form kaze "10"!!!!

10???????? Lele, Kuku!

Kad ono pogledam u options-u da je Range checking i Overflow checking iskljuceno!!!

Divno... Ukljucim obe opcije, pokrenem program i on me pozdravi sa jednom porukom RangeCheck error i sa dve poruke Division by Zero... Popravim one greske koje sam napravio, i nastavim sa izvrsavanjem programa... A ono opet isto...

UF! Cudna je kompjuter biljka!

Sav sam kod stavio u zagrade {} i postepeno ih uklanjao, pa dosao do krivca:

Code:

Server.Active := True;


Ako izbrisem ovaj kod, sve ce biti OK, nema memory leak-a, ali onda ne mogu da primam pozive, mogu samo da ja zovem nekoga.

Kasnije sam pronasao file audiosettings.dat koji stoji u folderu gde se moj EXE nalazi, taj file koriste VoIP komponente za cuvanje podesavanja o koriscenom kodeku za kompresovanje zvuka koji se prenosi. Njega sam izbrisao, i sta se desi??? Nema vise memory leak-a, ali sta onda? Ogranicen sam na upotrebu PCM kodeka (onaj sto "kompresuje" zvuk od 3 sekunde na 100KB), tako da je neupotrebljiv! A kada podesim da koristi Speex kodek, (autor komponenata ga preporucuje zbog veoma velikog kvaliteta i stepena kompresije), komponenta sacuva ta podesavanja ponovo u audiosettings.dat, i opet memory leak...

Sta drugo da radim... Poslao sam mail nekom Ivanu Babikovu (onaj koji je napravio te komponente), pa cemo da vidimo sta cemo dalje (ne verujem da je lik napravio to chudo a da nije proverio sta radi).

U medjuvremenu, ako ima neka dobra dusa da testira da li se ovaj memory leak javlja kod njega? :-)

Spakovao sam program u ZIP: www.milicevici.com/homeworks/direcom.zip - ima negde oko 625 KB...

Sada me malo bole prsti i glava pa idem da prilegnem :-)... Hvala na pomoci do sada...
A man is smart. People are stupid.
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: Memory Leak hunting05.11.2004. u 13:42 - pre 236 meseci
Citat:

U medjuvremenu, ako ima neka dobra dusa da testira da li se ovaj memory leak javlja kod njega? :-)


Dobro si rekao, 50k/sec ti pojede. Samo sam otvorio program (niti koga zovem niti primam kakav poziv niti znam kako to uopste da uradim). Dakle, stoji prozor, i jede mi ram :)

Ako nista drugo pokazali smo da nisi lud ;)

ss.
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: Memory Leak hunting05.11.2004. u 13:51 - pre 236 meseci
I btw, ne radi ti X za zatvaranje programa :)

ss.
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

burex
46°05'N 19°39'E

Član broj: 24964
Poruke: 987
*.verat.net.



+679 Profil

icon Re: Memory Leak hunting05.11.2004. u 16:47 - pre 236 meseci
Onaj Babikov je poslao nazad poruku, rekao je da ce da pogleda u cemu je problem, a najverovatnije je u kodeku.

BTW: Jesam lud, ali nisam slep. :-))

Kako se koristi:

Add new contact -> U "name" upisi bilo kakvo ime, u "phone url" upisi neki IP (ili host) i port, recimo 127.0.0.1:695 (695 je inace default port) -> OK

Onda izaberi u combo box-u tu stavku sto si sad uneo i pritisni call/answer.

A sto se tiche chat-a, ako si vec izabrao tu stavku sto si sad uneo (polje "Chat With host" je automatski popunjeno), samo upisi poruku, pritisni enter (ili klikni na strelicu) da bi poslao poruku.

Ipak, ocigledno je da je ovo beta...
A man is smart. People are stupid.
 
Odgovor na temu

burex
46°05'N 19°39'E

Član broj: 24964
Poruke: 987
*.verat.net.



+679 Profil

icon Re: Memory Leak hunting09.11.2004. u 23:20 - pre 236 meseci
Problem resen... Posto u okviru ovih VoIP komponenata ima na desetine .pas fajlova, bilo je malo poteskoca pri pronalazenju krivca... Ipak je izbor suzen na file NMMVoiceBroadcastServer.pas... Sada je sve OK... Kada sam uporedio file koji sam primio od Babikova, uporedio sam ga sa onim orginalnim i pronasao ovaj novi event...

procedure TNMMVoiceBroadcastServer.OnCodingFinished(Sender: TObject);
begin
FCodeThread:= nil;
end;
A man is smart. People are stupid.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Memory Leak hunting

[ Pregleda: 3118 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.