Autor Téma: FastMM - výpis všech alokovaných řetězců  (Přečteno 228 krát)

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
FastMM - výpis všech alokovaných řetězců
« kdy: 07-05-2019, 10:01:11 »
Nezabýval jste se někdo otázkou, jak z FastMM dostat seznam všech aktuálně alokovaných řetězců? Někde mi leakují stovky až tisíce řetězců, což už jsem dříve viděl v souvislosti s jejich použitím v recordech, ale bohužel se strašně špatně hledá, kde ten leak nastává, takže bych si chtěl vypsat všechny řetězce do souboru, počkat, až leaknou další, znovu vypsat a porovnat změny - třeba podle obsahu řetězců poznám, kde to nastává.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2358
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #1 kdy: 07-05-2019, 10:25:23 »
Nezabýval jste se někdo otázkou, jak z FastMM dostat seznam všech aktuálně alokovaných řetězců? Někde mi leakují stovky až tisíce řetězců, což už jsem dříve viděl v souvislosti s jejich použitím v recordech, ale bohužel se strašně špatně hledá, kde ten leak nastává, takže bych si chtěl vypsat všechny řetězce do souboru, počkat, až leaknou další, znovu vypsat a porovnat změny - třeba podle obsahu řetězců poznám, kde to nastává.

Kdysi jsem to zkousel, jako vzor si vem FastMM4, funkci DetectStringData, ale nez to budes zkouset nestaci to co nabizi primo FastMM pri ukonceni, tj. zobrazi neuvolnene stringy.

Mne se to delo kdyz jsem spatne uvolnoval struktury pro VirtualTreeView bez Finalize a timto jsem na to prisel.
Embarcadero MVP - Czech republic

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #2 kdy: 07-05-2019, 10:36:15 »
Memory manager ma interface jen pro (re)alokaci a uvolneni pametovych bloku. Co je v nich muze maximalne hadat.
To se mýlíš.

Kdysi jsem to zkousel, jako vzor si vem FastMM4, funkci DetectStringData, ale nez to budes zkouset nestaci to co nabizi primo FastMM pri ukonceni, tj. zobrazi neuvolnene stringy.
Výpis neuvolněných stringů jsem neviděl, jen jejich počty.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2358
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #3 kdy: 07-05-2019, 11:03:53 »
[Výpis neuvolněných stringů jsem neviděl, jen jejich počty.

FullDebugMode s FastMM_FullDebugMode.dll, leaknuto bylo Test PEPAK
Kód: Delphi [Vybrat]
  1. 772A7C7F [Unknown function at RtlDeactivateActivationContextUnsafeFast]
  2.  
  3. The block is currently used for an object of class: UnicodeString
  4.  
  5. The allocation number is: 128
  6.  
  7. Current memory dump of 256 bytes starting at pointer address 7EF9BB60:
  8. B0 04 02 00 01 00 00 00 0A 00 00 00 54 00 65 00 73 00 74 00 20 00 50 00 45 00 50 00 41 00 4B 00
  9. 00 00 DC D1 EB 1A 80 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  10. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  11. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  12. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  13. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  14. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  15. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  16. °  .  .  .  .  .  .  .  .  .  .  .  T  .  e  .  s  .  t  .     .  P  .  E  .  P  .  A  .  K  .
  17. .  .  Ü  Ń  ë  .  €  €  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
  18. .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
  19. .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
  20. .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
  21. .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
  22.  
Embarcadero MVP - Czech republic

Offline raul

  • Hrdina
  • ****
  • Příspěvků: 268
  • Karma: 14
    • Verze Delphi: FPC :D
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #4 kdy: 07-05-2019, 11:11:07 »
Kdysi jsem upravoval jeden z MM tak, aby ukladal i info o threadu, ktery pamet alokoval. A zaroven byla moznost pekne zamest - samozrejme s rozumem.

Nevim uz o ktery slo MM - mozna eureka. Tak ci tak se tam dal pri ukonceni (v mem pripade vlakna, ale samozrejem pri ukonceni programu) dal project seznam a obsahy si vypsat.

Neni problem upravit getmem (a dalsi) tak, aby aloknul vetsi kousek pameti a tam si ulozil napriklad id threadu a zaroven k minule alokaci pridat odkaz na tuto. Pak to mas jako linkedlist, ktery projedes a ihned vidis. Samo, ze je to jen v ramci debug (jinak to zpomaluje) ale pomohlo to tehda dost a mam pocit, ze to dodnes osekane bezi i v release - uklid po vlaknech tretich stran.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2358
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #5 kdy: 07-05-2019, 11:14:25 »
FullDebugMode s FastMM_FullDebugMode.dll, leaknuto bylo Test PEPAK
Kód: Delphi [Vybrat]
  1. 772A7C7F [Unknown function at RtlDeactivateActivationContextUnsafeFast]
  2.  
  3. The block is currently used for an object of class: UnicodeString
  4. ....
  5.  

A pokud mas k tomu MAP, tak ti samozrejme ukaze call stack kde jsi to alokoval.
https://delphi.cz/post/Detekce-problemu-za-pomoci-FastMM4.aspx
« Poslední změna: 07-05-2019, 11:16:12 od Radek Červinka »
Embarcadero MVP - Czech republic

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #6 kdy: 07-05-2019, 11:17:13 »
Nemylim. Nebo mas snad za to ze kdyz si budes (rucne) alokovat bloky pameti a do nich zapisovat data podobna internim strukturam retezcu ci objektu ze pujde skutecne o retezce ci objekty (alokovane patricnym, kompilatorem vygenerovanym kodem)?
Na nic takového jsem se ovšem neptal.

FullDebugMode s FastMM_FullDebugMode.dll, leaknuto bylo Test PEPAK
Hmm, v mé verzi ne. Budu se muset podívat na novější. Díky za tip.

Nevim uz o ktery slo MM - mozna eureka. Tak ci tak se tam dal pri ukonceni (v mem pripade vlakna, ale samozrejem pri ukonceni programu) dal project seznam a obsahy si vypsat.
Ano, EurekaLog to umí. Pro tento případ ji bohužel nemohu použít.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1436
  • Karma: 34
    • Pepak.net
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #7 kdy: 07-05-2019, 11:28:11 »
Radši no comment.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2358
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #8 kdy: 07-05-2019, 11:28:51 »
FullDebugMode s FastMM_FullDebugMode.dll, leaknuto bylo Test PEPAK
Hmm, v mé verzi ne. Budu se muset podívat na novější. Díky za tip.

Tady mas pro jistotu .inc soubor
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2594
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:FastMM - výpis všech alokovaných řetězců
« Odpověď #9 kdy: 07-05-2019, 11:34:28 »
Výpis neuvolněných stringů jsem neviděl, jen jejich počty.
Ja jsem si jednou pro nejake pametove stress testy udelal Q&D stylem nejaky tool nad jejich demem FastMMUsageTracker.pas, ale uz si nepamatuju o co slo ani v jakem projektu ani kde to skoncilo, jeslti by se to nedalo pouzit :'(