Autor Téma: LoadPackage/UnloadPackage a LiveBinding  (Přečteno 1084 krát)

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
LoadPackage/UnloadPackage a LiveBinding
« kdy: 16-01-2024, 09:25:49 »
Máme modulární aplikaci, která používá několik BPL modulů. V každém modulu jsou tzv agendy (TFrame).
Pokud user chce použít nějakou agendu, tak se nahraje do paměti příslušný modul/bpl (LoadPackage). Při odhlášení uživatele se všechny otevřené BPL zase uvolní (UnloadPackage).
Tohle bylo naprganý před 20 lety a fungovalo to vždy na všech Delphi co jsme měli 7, 10, 2010, 11 (co si tak vzpomínám). S přechodem na D12 se user odhlásí a při dalším přihlášení a nahrání BPL do paměti (LoadPackage) lítá nevystopovatelná chyba někde v útrobách knihovny LiveBindings. Většinou to zařve AV at adress blabla in module bindingengine290.bpl. Read of address 000008. To číslo adresy je vždy takhle malý (8 až C).
LiveBinding vůbec nepoužíváme a ani nevím jak to pořádně funguje. Po ukončení mi to pak napíše:


Citace
Unexpected Memory Leak
An unexpected memory leak has occurred. The unexpected small block leaks are:
21 - 28 bytes: TBindingManagerDefault x 1


Pls, nedá se ten Binding nějak globálně zakázat (hledal jsem nenašel)? Nebo nemáte někdo nějaký nápad? Mě už nápady dochází a bohužel i čas na řešení :/. Ď.
« Poslední změna: 16-01-2024, 09:35:59 od soko.ban »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3457
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #1 kdy: 16-01-2024, 10:07:22 »
adresa 8 - C znamena IMHO pristup na objekt, ktery je nil a jeho metodu

  vmtRelease           = 8 ;
  vmtCreateObject      = 12 ;

Kdyz to prelozis s debug dcu, tak ti to neukaze, kde dojde k chybe? ladici info tam je "c:\Program Files (x86)\Embarcadero\Studio\23.0\bin\bindengine290.jdbg"  ( a je to bindengine, ne bindingengine)
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3457
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #2 kdy: 16-01-2024, 10:08:26 »
Zkus pouzit FastMM ve fulldebug mode, je mozne ze mas nejakou instanci zapamatovanou, a ta uz je nil.
Embarcadero MVP - Czech republic

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #3 kdy: 16-01-2024, 10:18:50 »
Ono to vypadá, že při UnloadPackage té modulové BPL to sebou vezme i naše "hlavní" BPL, v kterém je naprganý celý jádro a který je v requires těch dílčích bpl.
Při UnloadPackage se dokrokuju do finalization části té hlavní bpl. Ta se ale unloadnout v žádném případě nemá.

Každopádně dík za rady, budu bádat dál.

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #4 kdy: 17-01-2024, 10:06:02 »
Kdyby náhodou někoho zajímalo jak to dopadlo...

Přišel jsem na to, že při UnloadPackage modulového BPL se volají finalization sekce hlavního BPL. To mě lehce vyděsilo a celej ten BPL manager jsem udělal globální a při odhlášení usera se BPL neuvolňují. Tenkrát jsme se snažili šetřit paměť, dneska už na to kašlu.
Zajímalo by mě co tam soudruzi v Embarcaderu vylepšili, že to přestalo fungovat, ale pátrat po tom nebudu.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3457
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #5 kdy: 17-01-2024, 10:22:02 »
Kdyby náhodou někoho zajímalo jak to dopadlo...

Přišel jsem na to, že při UnloadPackage modulového BPL se volají finalization sekce hlavního BPL. To mě lehce vyděsilo a celej ten BPL manager jsem udělal globální a při odhlášení usera se BPL neuvolňují. Tenkrát jsme se snažili šetřit paměť, dneska už na to kašlu.
Zajímalo by mě co tam soudruzi v Embarcaderu vylepšili, že to přestalo fungovat, ale pátrat po tom nebudu.

Zajimave: pokud ma BPL v referencich, ze zavisi na nejake BPL, tak pri zavedeni zavede i BPL na ktere zavisi. Pri unloadu naopak tu zavislou musi uvolnit. A to tak snad bylo vzdy ne? Hlavni exe ma taky zavislost na BPL? Protoze jestli ne, tak je to spravne chovani.



Embarcadero MVP - Czech republic

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #6 kdy: 17-01-2024, 10:29:53 »
No že uvolní závislou bych chápal. Ale tohle je opačný případ.
Hlavní BPL nahrává různá "dceřiná" BPL, která jsou na té hlavní závislá. A když hlavní BPL uvolňuje dceřiné  BPL, tak se volá finalization té hlavní. To mi dobrý nepřijde.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3457
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #7 kdy: 17-01-2024, 10:48:18 »
No že uvolní závislou bych chápal. Ale tohle je opačný případ.
Hlavní BPL nahrává různá "dceřiná" BPL, která jsou na té hlavní závislá. A když hlavní BPL uvolňuje dceřiné  BPL, tak se volá finalization té hlavní. To mi dobrý nepřijde.

Ja ti rozumim, ale ma ta dcerina v zavislostech tu hlavni? Psal jsi: naše "hlavní" BPL, v kterém je naprganý celý jádro a který je v requires těch dílčích bpl

Embarcadero MVP - Czech republic

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #8 kdy: 17-01-2024, 16:13:34 »
No dceřiná v requires tu hlavní potřebuje, protože má v uses její unity.
Pokud to vyhodím, tak to nejde přeložit.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3457
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #9 kdy: 17-01-2024, 17:05:13 »
No dceřiná v requires tu hlavní potřebuje, protože má v uses její unity.
Pokud to vyhodím, tak to nejde přeložit.

Ja bych do toho uz nerypal, ale to je prave spatne. Spravne by pouzite unity mely byt v jinem balicku - jako struktura shora dolu, ne kruhova reference. To pak samozrejme ma vliv treba na kompilaci, LSP atd. Jako ono to funguje, kompilator to prezvejkne, ale... Muj nazor.
Ano, chapu - vyprovodim se sam :-)

Embarcadero MVP - Czech republic

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #10 kdy: 17-01-2024, 19:39:34 »
No, kruhový reference tam nejsou.
Zjednodušeně řečeno, v tom základním balíku (třeba main.bpl) je jádro sloužící k zobrazovaní agend, definice agendy TAgenda=class(TFrame) v agenda.pas a další kód včetně vizuálních komponent, různých výpočtů atd.

V dceřiném třeba AgendaA.bpl je v agendaA1.pas a v ní TAgendaA1=class(TAgenda), agendaA2.pas/TAgendaA2=class(TAgenda), atd. A ty musí mít v uses agenda.pas (+ další unity s komponentama a výpočtama) a tudíž to bpl musí mít v requires main.bpl.

Analogicky je AgendaB.bpl a v ní agendaB1.pas/TAgendaB1=class(TAgenda), agendaB2.pas/TAgendaB2=class(TAgenda)...

Takhle to bylo vymyšlený před 25 lety a doteď s tím nebyly problémy. Nevidím, co je na tom špatně.

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1567
  • Karma: 52
    • Verze Delphi: 11.3
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #11 kdy: 17-01-2024, 22:00:45 »
A nechcete místo .bpl prostě vyrobit jeden větší .exe a mít od toho už navždy pokoj? ;-)

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 575
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #12 kdy: 20-01-2024, 14:17:10 »
tiez som skusal pred 15-20rokmi modulovanie aplikacie cez bpl baliky. Ako fungovalo to, ale ta udrzba casom bola jednoducho velmi unavna, po mozno cca 3-5rokoch som to tiez opustil a nikdy sa k tomu uz nevratil.

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re:LoadPackage/UnloadPackage a LiveBinding
« Odpověď #13 kdy: 09-04-2024, 14:16:18 »
Hm, tak z podobného ranku jsme měli i problém s registrací com knihoven. Kolega mi dnes hlásil, že s D12.1 už to funguje. Tak jsem zkusil vrátit původní kód i kolem LoadPackage/UnloadPackage a světe div se funguje to.
Takže děkuji do Embarcadera za několik dní pátrání.