Forum Delphi.cz

Delphi => Obecné => Téma založeno: Stanislav Hruška 11-11-2019, 21:59:19

Název: AV pri existujúcom objekte
Přispěvatel: Stanislav Hruška 11-11-2019, 21:59:19

Mám vytvorené FDQuery. Ak naň ukážem kurzorom, tak mi vypíše o ňom všetko. Transaction, Connection...
Napriek tomu mi pri prístupe k nemu vyhodí AV. Tak isto mi zakričí   Assert(Assigned(FqryDepositUpdate_Pay));
Tu naozaj neviem čo a kde mám hľadať. Žeby som zas musel prerobiť formulár? To by už bolo priveľa.
.
To programovanie sa mi prestáva páčiť a začína ma pekne... >:( >:( >:(

Název: Re:AV pri existujúcom objekte
Přispěvatel: Radek Červinka 11-11-2019, 22:05:57
Mas zapnuto "use debug dcu"? Ukaz call stack s AV. To ze ti debugger neco ukaze, neni nejdulezitejsi, debugger diky spatne napsanemu kodu (napr. s with) muze ukazat neco jineho. Nemas tam with?
Název: Re:AV pri existujúcom objekte
Přispěvatel: Stanislav Hruška 11-11-2019, 22:35:39
with zásadne nepoužívam. Je to tisíckrát použitá technika. Vytvorím si (raz) FDQuery pomocou funkcie a potom ju používam. V dedení chybu nevidím.
Název: Re:AV pri existujúcom objekte
Přispěvatel: Radek Červinka 11-11-2019, 22:41:52
CallStack = viz obrazek
Název: Re:AV pri existujúcom objekte
Přispěvatel: Stanislav Hruška 11-11-2019, 22:52:54
Ja som už mimo :)  Prvý obrázok je stav pred a druhý po AV. Pri AV vypíše Process is not accessible a všetky panely, okrem spodného, sú prázdne. V poslednom je:
First chance exception at $007D6538. Exception class $C0000005 with message 'access violation at 0x007d6538: read of address 0x000002f8'. Process JasotSVB.exe (10696)
Název: Re:AV pri existujúcom objekte
Přispěvatel: Stanislav Hruška 11-11-2019, 22:54:08
Zlý prvý obrázok
Název: Re:AV pri existujúcom objekte
Přispěvatel: Radek Červinka 11-11-2019, 23:39:41
...
Prvý obrázok je stav pred a druhý po AV.
Ale mne spise zajima v okamziku AV :-), jsi si jisty, ze jsi ten FqryDepositUpdate_Pay uz neuvolnil predtim? Idealne si nastavit pri uvolnovani FqryDepositUpdate_Pay  na nil. Pouzivas vlakna?
Název: Re:AV pri existujúcom objekte
Přispěvatel: Mi.Chal. 12-11-2019, 06:57:55
First chance exception at $007D6538. Exception class $C0000005 with message 'access violation at 0x007d6538: read of address 0x000002f8'. Process JasotSVB.exe (10696)

Podle te nizke adresy lezes na neco, co je nil. Bud si to nevytvorl nebo to pouzivas z vic mist a jinde sis to uvolnil.
Název: Re:AV pri existujúcom objekte
Přispěvatel: Stanislav Hruška 12-11-2019, 08:40:42
V okamžiku AV tam je len ten oznam. Vlákna nepoužívam. Pri uvoľňovaní vždy používam FreeAndNil. FqryDepositUpdate_Pay uvoľňujem až pri uvoľňovaní objektu. Pre istotu preverím to uvoľňovanie.
Název: Re:AV pri existujúcom objekte
Přispěvatel: Stanislav Hruška 12-11-2019, 09:08:54
Už som to objavil. Definoval (strict private) som to v základnej triede a potom aj v potomkovi. Tým to je jasné.
.
Edit: to private je omyl. Samozrejme, že to je protected.
Název: Re:AV pri existujúcom objekte
Přispěvatel: pf1957 12-11-2019, 11:03:46
Už som to objavil. Definoval (strict private) som to v základnej triede a potom aj v potomkovi. Tým to je jasné.
Mozna nadesel cas zacit psat kod ciste tak, abys po prekladu dostal 0 errors, 0 warnings a vsechny warningy vyresit i za cenu pridani jaloveho kodu, protoze nektere warningy Delphi stale nejdou. A kod vubec nespoustet, pokud nemas 0 warnings -> od toho tam ty warningy jsou a prekladac te v podstate zadarmo upozorni na spoustu neplech
Název: Re:AV pri existujúcom objekte
Přispěvatel: Mi.Chal. 12-11-2019, 13:12:11
V okamžiku AV tam je len ten oznam. Vlákna nepoužívam. Pri uvoľňovaní vždy používam FreeAndNil. FqryDepositUpdate_Pay uvoľňujem až pri uvoľňovaní objektu. Pre istotu preverím to uvoľňovanie.

To je hezké, že používáš FreeAndNill, ale pokud to před použitím nekontroluješ, jestli to nil neni, tak to dopadne takhle. Tam co ti to padá ten objekt je nil. Pokud by nebyl, tak ta adresa nebude takhle nízká (ta adresa je místo objektu v paměti + offset v té třídě, pokud je nízká, tak ten objekt je nil).
Název: Re:AV pri existujúcom objekte
Přispěvatel: Stanislav Hruška 12-11-2019, 13:31:58
Citace
Mozna nadesel cas zacit psat kod ciste tak, abys po prekladu dostal 0 errors, 0 warnings a vsechny warningy vyresit i za cenu pridani jaloveho kodu, protoze nektere warningy Delphi stale nejdou. A kod vubec nespoustet, pokud nemas 0 warnings -> od toho tam ty warningy jsou a prekladac te v podstate zadarmo upozorni na spoustu neplech
Robím to zásadne tak. V tomto prípade som nemal žiaden oznam.
Citace
To je hezké, že používáš FreeAndNill, ale pokud to před použitím nekontroluješ, jestli to nil neni, tak to dopadne takhle.
Problém bol v tom, že som nevedomky vytváral objekt dvakrát, aj keď som tvrdil niečo iné. V "root parent" i v potomkovi, v ktorom som znova definoval pole FqryDepositUpdate_Pay.
Ja mám byť o 22.00 už v posteli. Hlava už takú záťaž nezvláda. Pod 10 hodín denne pred PC asi ani nejdem.
Název: Re:AV pri existujúcom objekte
Přispěvatel: pf1957 12-11-2019, 15:03:24
Robím to zásadne tak. V tomto prípade som nemal žiaden oznam.
Aha, to jsem precenil Delphi. Ve VS jakmile neni member u predka (strict) private, tak na skryti clena u predka bezne upozornuje.