Aplikace z D6 občas zamrzne a hlásí "not responding"

Autor Téma: Aplikace z D6 občas zamrzne a hlásí "not responding"  (Přečteno 7464 krát)

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 432
  • Karma: 17
    • Verze Delphi: D2007, XE3
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #15 kdy: 23-06-2015, 10:06:48 »
Remote debuging mi tiez hodne intenzivne padal vo viacerych verziach delphi. Prestal som ho pouzivat. Ak sa ti nepodari naistalovat delfinu do toho pecka, tak ostava este dalsia moznost, ale moze byt v celku dost pracna. Urobit nejaky logger z ktoreho zistis co aplikacia robila naposledy pred tym nez zamrzla. Nemusis hned napisat logging pre celu apku, napriklad len loguj dookola v akych stavoch sa ti nachadzaju jednotlive vlakna. Postupne ta to zacne navadzat na miesta kde vznika problem a prave v tych miestach mozes postupne zintenzivnovat logging. Stalo sa mi vsak uz aj to, ze sa to zvyklo hryznut stale na inom mieste. A po chvili sme zistili ze problemom bol hardver samotneho pecka ktory zacinal postupne kolabovat a do niekolkych dni umrel uplne.

Dalsia vec ktoru by som odporucil mozno este viac je MadExcept. MadExcept prinasa so sebou jednu velmi sikovnu utilitku, dokaze trejsovat procesy ktore boli s madexceptom skompilovane. Myslim ze to funguje nejako tak ze kazda aplikacia skompilovana s madexceptom vytvara v ramke nejaky MMF subor kde su rozpisane vsetky podsatne udaje o procese vlaknach a stackoch. A ked to skompilues so vsetkym potrebnymi debug datami tak ti to ukazuje aj velmi luxusne unitu, nazov funkcie a cislo riadka kde sa to vlakno prave tula. Je to plateny produkt ale da sa pre nekomercne pouzitie vyskusat zdarma. Taketo moznosti budu mat mozno aj ine debug tooly (eurekalog, jcldebug a pod), ale vsimol som si toho predovsetkym u madexceptu. Je to featurka jak cukrik ;)

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 123
  • Karma: 8
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #16 kdy: 23-06-2015, 10:16:32 »

Nějaká rada?

A ten fixpack jsi zkoušel? Stačí dát do uses a zkusit. My bez něho nedáme nic z D7 ven.

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #17 kdy: 23-06-2015, 10:37:09 »
Fixpack nezabral.

Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #18 kdy: 23-06-2015, 10:57:57 »
Mě by zajímalo, jestli to jede na 32-bitových Windows 7. Pořád mám pocit, že těm 64-bitovým děláš něco nekorektního.

hu

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 123
  • Karma: 8
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #19 kdy: 23-06-2015, 10:59:34 »
Fixpack nezabral.

Ještě jaký je tam manifest. Případně komponenty na těch formech. Případně jsou tam Hinty?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2165
  • Karma: 116
    • Verze Delphi: D2007, XE3, DX10
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #20 kdy: 23-06-2015, 11:06:02 »
Chybu zamrznutí aplikace vyvoláme takto:
Máme formulář na kterém kreslíme na canvas Paintboxu. Jakmile zobrazíme nové okno (menší a přes ten canvas), které si převezme focus (modrá horní lišta okna) a klikneme na spodní menu (které v tu chvíli focus nemá) tak dojde k zamrznutí.
Predpokladam, ze na ten Canvas kreslite v kontextu zpravy WM_PAINT tj. bud v prekryte metode Paint nebo v udalosti OnPaint...

Vztah toho, cos popsal, je k pumpe zprav jaky?
 - kresleni na Canvas
 - aktivity nove otevreneho okna

Vyse jsi psal, ze jste vyhazeli vsechna volani ProcessMessages. Nezamrzne to proste proto, ze se vlivem nejakeho nestastneho navrhu prestanou distribuovat zpravy
(jako akt zoufalosti muzes porovnat zdrojovky pred vyhazenim ProcessMessages s aktualnim stavem a eventualne tam nektere docasne vratit, abys mohl chybu lokalizovat.
Protoze se vsechno v GUI odehrava pres zpravy, mozna by ti mohl ukazat neco WinSight (tusim v D6 by jeste mel byt, nebo pouzit MS spyxx*.exe)

Osobne bych se prilis nesoustredil na to, ze to pod XP fungovalo a na W7 to nefunguje. Ty XP bezely pravdepodobne na nejakem jinem HW, takze byla jina dynamika a pokud jste vyrobily race condition chybu, tak proste jednoduse vyplula.


Offline hlucheucho

  • Plnoletý
  • ***
  • Příspěvků: 196
  • Karma: 2
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #21 kdy: 23-06-2015, 11:23:00 »
ještě ke vzdálenému debuggingu: možná bys měl IDE spouštět jako správce. Nainstaluj si 32-bitové aplikace a jejich části (dll, bpl) do adresářů kam patří, použij vhodný režim kompatibility.
Pokud ti to nepojede s 32-bitovými Windows 7 ani s režimem kompatibility, ale aplikace na starších OS funguje, je zřejmě nutné aplikaci upravit a zkompilovat v novějších Delphi. Pokud ti to s 32-bitovými Windows 7 pojede, ale se 64-bitovými ne, buď při instalaci aplikace na 64-bitový OS děláš něco špatně nebo je nutné aplikaci upravit a zkompilovat v novějších Delphi nejlépe se 64-bitovým překladačem.
Ještě si vzpomínám na jednu "kličku" co jsme tu kdysi zkoušeli: nainstalovat virtuální stroj s Windows XP a takovou aplikaci spouštět na něm. Ne vždy byly výsledky uspokojivé. Po upgrade na XE5 kde 64-bitový překladač je jsem tyto problémy a kličky přestal řešit.

hu


Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #22 kdy: 23-06-2015, 11:47:07 »
Aplikaci jsme zkoušeli na stejném HW s Win XP i Win 7. Možná jsme ale na něco přišli:

Kreslení na canvas v menu máme na proceduru KRESLI. Tu voláme když potřebujeme a zároveň se volá i v OnPaint eventu - aby se pošetřilo překreslení pokud se objeví přes kreslící plochu nějaké menu či jiný objekt. Je možné, že docházelo ke spuštění procedury KRESLI a zároveň vznikl požadavek OnPaint. Když si k tomu přidám ProcessMessages/HandleMessage, tak to mohlo způsobit totální zamrznutí aplikace.

Momentálně testujeme upravenou verzi a zatím se nám chybu nepovedlo nasimulovat (což byla předtím vždy otázka několika minut).

Uvidíme ...   

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 123
  • Karma: 8
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #23 kdy: 23-06-2015, 12:24:58 »
To skor vypadá na zacyklení kde processmessages - zavolá zpracování fornty a  to zavolá vykreslení - které zavolá processmessages a tak stále dokola.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2165
  • Karma: 116
    • Verze Delphi: D2007, XE3, DX10
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #24 kdy: 23-06-2015, 12:29:23 »
To skor vypadá na zacyklení kde processmessages - zavolá zpracování fornty a  to zavolá vykreslení - které zavolá processmessages a tak stále dokola.
Pri takove rekurzi by mu pretekl zasobnik, ne?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2165
  • Karma: 116
    • Verze Delphi: D2007, XE3, DX10
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #25 kdy: 23-06-2015, 12:39:15 »
To skor vypadá na zacyklení kde processmessages - zavolá zpracování fornty a  to zavolá vykreslení - které zavolá processmessages a tak stále dokola.
Nehlede na to, ze psal, ze ProcessMessages vsude odstranili...

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #26 kdy: 23-06-2015, 12:56:10 »
ProcessMessages jsme všude vyhodili, ale museli jsme nechat HandleMessage, které vždy utneme při dosažení určitého času (vstupní parametr procedury). Možná se prostě sejdnou ve frontě dva stejné požadavky na kreslení a ty se zacyklí. Stává se to velmi zřídka.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2165
  • Karma: 116
    • Verze Delphi: D2007, XE3, DX10
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #27 kdy: 23-06-2015, 13:44:17 »
ProcessMessages jsme všude vyhodili, ale museli jsme nechat HandleMessage,
Jestli obslouzite vsechny pending message nebo jen jednu, ono to vyjde z pohledu mozne rekurze skoro nastejno, akorat pravdepodobnost vyskytu bude nizsi :-)
Oboje to patri mezi zahrzenihodne techniky.

Citace
které vždy utneme při dosažení určitého času (vstupní parametr procedury). Možná se prostě sejdnou ve frontě dva stejné požadavky na kreslení a ty se zacyklí. Stává se to velmi zřídka.
To znamena co: "utneme"? Vy v obsluze vybranych zprav tj. eventech udelate predcasny exit?

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #28 kdy: 23-06-2015, 14:03:11 »
Vím, že spoustu lidí nedoporučuje ProcessMessages a HandleMessage. Občas to ale nejde jinak.

HandleMessage obslouží jednu message událost. Pokud tedy chceme z nějakého důvodu chvilku počkat (třeba 500ms), tak spustíme Timer a po požadovanou dobu voláme HandleMessage. Vždy ji necháme doběhnout a pak akorát vyskočíme z cyklu.

 

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2165
  • Karma: 116
    • Verze Delphi: D2007, XE3, DX10
Re:Aplikace z D6 občas zamrzne a hlásí "not responding"
« Odpověď #29 kdy: 23-06-2015, 14:14:42 »
Vím, že spoustu lidí nedoporučuje ProcessMessages a HandleMessage. Občas to ale nejde jinak.
Samozrejme, ze to jde bez toho, jen se ta aplikace musi naprogramovat a ne naklikat...

Ja za svou praxi videl jediny pripad, kdybych nad tim zamhouril oko a to kvuli nejakym komponentam 3. strany, ktere se bez toho nechteli zinicializovat. Uz ani nevim, co to bylo zac a ani jsem to neprogramoval.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: