Nacházíte se zde: Úvod » Geodézie a projektování » Tipy a triky » Technické rady » Chybové stavy při běhu maker
Chybové stavy při běhu maker
Chybové stavy při běhu maker
Jan Kuzník, 30. března 2000
Řada uživatelů zažila situaci, kdy funkce Kokeše skončila podobným chybovým hlášením:
1 | c:\kokes\test.kbe: Neplatný popisovač na adrese 31104128 (1da9c80) |
S největší pravděpodobností se jedná o neošetřený chybový stav některého z připojených maker. Následující příspěvek poskytuje informace o tom, co se vlastně stalo, jak se vyhnout následkům a jak zjednat nápravu.
Při plánování vývoje makrojazyka Kokeš Basic jsme se řídili třemi požadavky:
- Basic bude k dispozici každému uživateli.
- Basic bude bezpečný, tzn. makro nemůže způsobit havárii jádra Kokeše
- Basic bude natolik výkonný, aby umožnil profesionální práci.
Bod 1 a 3 se podařilo během času naplnit vrchovatě. S výjimkou otevírání a zavírání výkresu jsou skoro všechny uživatelské funkce Kokeše dnes napsány v Basicu. V bodu 2 jsme museli trošku slevit. Požadavky na maximální výkon vedly k povolení některých “nebezpečných” technik, jako je přímé volání DLL knihoven. Nicméně nadále platí, že jádro Kokeše intenzivně kontroluje operace prováděné makry a v případě potřeby neváhá sáhnout k opatřením. Funkce, která se proviní proti pravidlům, je násilně přerušena a systém vypíše na konzolu červený řádek s odpovídajícím hlášením. Dozvíme se z něj jméno viníka (kbe modul) a absolutní adresu poslední úspěšně provedené instrukce makrojazyka.
Celou situaci si můžeme názorně ilustrovat na příkladu. Představme si, že potřebujeme funkci, která zvětší měřítko aktivního okna o 100. Je velmi nepravděpodobné, že by se taková funkce někdy objevila v oficiální distribuci, takže si ji musíme napsat sami. Po kratším studiu helpu programátor-začátečník dojde k následujícímu řešení:
1 2 3 4 | <strong>macro</strong><font color="#0000ff"> IncrScale</font> <strong> window</strong><font color="#0000ff"> wnd</font><strong>=</strong><font color="#0000ff">WinGetActive</font><strong>()</strong><font color="#808080">'zjistime aktivni okno</font> <font color="#0000ff"> WinSetScale</font><strong>(</strong><font color="#0000ff">wnd</font><strong>,</strong><font color="#0000ff">WinGetScale</font><strong>(</strong><font color="#0000ff">wnd</font><strong>)+</strong><font color="#800080">100.0</font><strong>)</strong> <strong>end macro</strong> |
Vše nádherně funguje do doby, než někdo tuto funkci spustí v Kokešovi bez načtených dat a tedy bez grafických oken. Popisovač aktivního okna wnd bude neplatný a při pokusu o zjištění měřítka takového okna musí jádro Kokeše makro násilně ukončit, jinak by špatně dopadlo samo.
Havárie tohoto druhu v Basicu jsou mnohem méně nebezpečné než odpovídající havárie v jádře. Systém zajištující běh makra zjistí, že došlo k neočekávanému konci, takže se pokusí alespoň o částečný úklid. Navíc veškeré editační funkce v Basicu jsou koncipovány tak, že jejich výsledkem jsou vždy platná data. Nemůže se proto stát, že by přerušení mělo za následek poškození dat. Mohou sice vzniknout data jiná, než uživatel očekával, ale určitě půjdou uložit a znovu načíst. Případné chyby je možno později opravit vhodnou editační funkcí. Profesionálně udělané makro se ovšem takto chovat nesmí. Pokud k incidentu dochází ve firemním makru, tak buď došlo k programátorské chybě, nebo se uživateli podařilo navolit podmínky, se kterými programátor nepočítal. V obou případech je vhodné pokusit se lokalizovat místo chyby, což obvykle vede k nápravě v příští verzi.
Lokalizace chyby v Basicu je v principu proveditelná s využitím adresy poslední instrukce uvedené v chybovém hlášení. Problém spočívá v tom, že tato hodnota závisí na pořadí a počtu načtených modulů maker, a u dvou Kokešů spuštěných na různých počítačích nemusí souhlasit. Před hlášením závady je proto potřeba absolutní adresu převést na adresu relativní vůči začátku modulu. Pro tento účel přikládáme ke každé instalaci Kokeše makro ATEST.KBE. Normálně není v Kokeši načteno, ale je možno jej ručně načíst a spustit jedno z pěti testovacích maker. Výstup jde do protokolu stejně jako předchozí chybová hlášení, takže stačí poslat protokol se stručným popisem problému.
Přesný popis toho, co makro atest umí vypsat, jde nad rámec zájmu běžného uživatele. K makru atest se ale určitě vrátíme v některém článku věnovanému praktickému programování v Kokes Basicu.
Podrobný postup:
Nástroje – načtení makra – vybereme soubor ATEST.KBE
Nástroje – atest – basadr – zadáme první číslo z chybového
hlášení
Pro jistotu můžeme ještě přidat podrobný výpis přidělení paměti v systému Basicu
Nástroje – atest — baswalk
Protokol okopírujeme a pošleme se stručným popisem na adresu vyvoj@gepro.cz.
S velkou pravděpodobností bude v příští verzi chyba opravena. Pokud ovšem chyba brání normálnímu používání užitečné funkce, pak samozřejmě dodáme opravený modul okamžitě, jakmile bude k dispozici.
V případě našeho ilustračního makra by byla oprava velmi snadná. Doplníme test na platnost popisovače okna.
1 2 3 4 5 | <strong>macro</strong><font color="#0000ff"> IncrScale</font> <strong> window</strong><font color="#0000ff"> wnd</font><strong>=</strong><font color="#0000ff">WinGetActive</font><strong>()</strong><font color="#808080"> 'zjistime aktivni okno</font> <strong> if NOT</strong><font color="#0000ff"> IsWindow</font><strong>(</strong><font color="#0000ff">wnd</font><strong>) then return</strong><font color="#808080"> 'konec makra</font> <font color="#0000ff"> WinSetScale</font><strong>(</strong><font color="#0000ff">wnd</font><strong>,</strong><font color="#0000ff">WinGetScale</font><strong>(</strong><font color="#0000ff">wnd</font><strong>)+</strong><font color="#800080">100.0</font><strong>)</strong> <strong>end macro</strong> |
A je to .