zverj ([info]zverj) rakstīja [info]koderi kopienā,
@ 2008-01-08 17:18:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
C++ jautājums: kā zem vizuālās studijas var noteikt memory leaks? Resp. pēc palaišanas kompilātors saka:

Detected memory leaks!
Dumping objects -
{1871} normal block at 0x00F8DAF0, 52 bytes long.
Data: 1 0 01 00 00 00 03 00 00 00 13 00 00 00 31 00 30 00
{1869} normal block at 0x00F8D9A0, 24 bytes long.
Data: C8 D3 F8 00 1C DA F8 00 FC DA F8 00 CE CD CD CD
{1868} normal block at 0x00F8DA10, 52 bytes long.
Data: L e 01 00 00 00 04 00 00 00 13 00 00 00 4C 00 65 00
{1866} normal block at 0x00F8D8C0, 12 bytes long.
Data: L 4C D1 F8 00 00 00 00 00 00 D7 F8 00
{1865} normal block at 0x00F8D930, 52 bytes long.


un tālak saraksts ar līdzīgu figņu, kas neko neizsaka. Kā noteikt, kuru aizmirsu izdzēst? Kāda metodika


(Ierakstīt jaunu komentāru)


[info]watt
2008-01-08 17:32 (saite)
parasti jau varēja uzklikšķināt, un tad jau debuģieris vainīgo new/malloc atrada

(Atbildēt uz šo) (Diskusija)


[info]zverj
2008-01-08 17:37 (saite)
Varbūt uz MFC arī tā, taču manā gadījumā atmiņu allocē externāla bibliotēka. Atmiņā paliek gan viņas hreni, gan arī manējais mainīgais.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]watt
2008-01-08 17:43 (saite)
mēģināt atmiņu atraut pēc tās adreses? laikam pie dump jau par vēlu, vilciens aizgājis.
var mēģināt pēc izmēra saprast, kas par struktūru.
var mēģināt ar bināro meklēšanu: komentēt izsaukumus ārā, kamēr atrod to, kas dod leak.

(Atbildēt uz šo) (Iepriekšējais)


[info]bubu
2008-01-08 19:27 (saite)
Ko es parasti daru - kautkādā common.h failā, kuru visur, inklūdēju ierakstu šādas rindas:
#ifdef _DEBUG
    #include <crtdbg.h>
    #define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif
Tas garantēs to, ka visi mani new izsaukumi tajā crtdbg bibliotēkā reģistrēsies ar tipu CLIENT_BLOCK (nevis NORMAL_BLOCK) un tas darbosies tikai Debug konfigurācijā. Attiecīgi tajā outputā, ko tu rādi, tiks drukāts aptuveni sekojošais:
main.cpp(11): {1866} client block at 0x00F8D8C0, 12 bytes long 
Data: L 4C D1 F8 00 00 00 00 00 00 D7 F8 00 
(uzsvars ir uz "client block")
Var viegli redzēt gan, ka tas ir tavs memory leaks (client block), gan arī kurā vietā (main.cpp faila 11. rindā). Ar dubultklikški uz šīs rindas IDE automātiski kursoru noliks norādītajā vietā (main.cpp faila 11. rindā).

Papildus tam, izmantojot crtdbg.h funkcijas var uzrakstīt filtru, kas izfiltrēs nost tos normal blokus. Pēc manas saprašanas tie parasti rodās visādos STL un citās bibliotēkās singletonos. Cik man liekās, tad šis Vizuālās studijas memory leaku detektors, izejot no programmas, nostrādā pirms globālu objektu destruktoriem. Tad nu tajā pašā STL'ā ir singletoni, kuri atmiņu atbrīvo tikai destruktoros. Mani personīgi tāda atmiņa neinteresē, tāpēc es ignorēju šos normal blokus. Lietoju filtru, kurš man rāda tikai client blokus un neskatos uz tiem normal blokiem.

Vienīgais mīnuss manam paņēmienam ir tāds, ka tas memory leakus uzrādīs tikai tavis kompilētājiem new (vai ar nelielu papildus kodu - arī malloc) izsaukumiem. Tas nerādīs kautkādus memoryleakus citu API izmantotajos resursos (atmiņai/failiem/bildēm/soketiem/utt).

(Atbildēt uz šo) (Diskusija)


[info]zverj
2008-01-08 19:54 (saite)
O! Paldies!

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?