Jak Debug Flat Thunks

Překlady článku Překlady článku
ID článku: 133722 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Ladění plochý thunks generovaných thunk kompilátor může být obtížné, protože mechanismus thunk je složitý a ladicí nástroje schopný trasování prostřednictvím thunks je obtížné používat. Tento článek představuje celkové strategie pro ladění plochý thunks, několik konkrétní techniky ladění a řešení potíží příručce, která vysvětluje, jak opravit mnoho běžných problémů thunking.

Další informace

Omezení na co lze cílové DLL

Dříve než začnete ladění thunks, mějte na paměti, že existují určitá omezení na co cílové DLL lze provést uvnitř thunk. Totiž aplikace založená na Win16 volání DLL systémem Win32 není systémem Win32 proces; podobně aplikace založená na Win32 volání DLL založené Win16 není systémem Win16 proces. Běžné určitá omezení patří:

  • Podprocesy uvnitř thunk nelze vytvořit z aplikace založené na Win16 se systémem Win32 DLL.
  • Kód uvnitř dll systémem Win32 nazývá thunks by vyžadovat zásobníku málo místa, protože volající založené Win16 procesy mít hromádek mnohem menší než aplikace založené na Win32.
  • Na základě Win32 dll při zpracování přerušení musí není thunk dll Win16, které obsahují službu rutiny přerušení (ISRs).
  • Aplikace založené na Win32 není musí předat ukazatelů data umístěná v zásobníku jako parametry thunks nebo volání DLL Win16, přepněte hromádek.

Proč ladění Flat Thunks může být obtížná

Ladění plochý thunks je obtížné, částečně, protože mechanismus plochý thunk je složité část jádra systému Windows. Její složitost stems z faktů musí transformaci v 32bitové zkompilovaný kód do volání funkce volání kompatibilní 16bitový kód a naopak. Protože kód 32bitové používá různé datové typy a PROCESORU zaregistrovat množiny z 16bitový kód, musí mechanismus plochý thunk přeložit parametry funkce, přepněte hromádek a přeložit vrácené hodnoty. Je optimalizován pro rychlost dosud musí povolit preemptivní kód Win32 volání bez preemptivní kód Win16. Kompilátor thunk jednodušší vytváření plochý thunks než ruční vytvoření, ale není foolproof.

Ladění plochý thunks není obtížné pouze protože mechanismus samotný je složitý, ale také protože jsou potřebné nástroje ladění obtížnější předlohy. Úroveň aplikace debuggers, například protože skládat z 32bitové a 16bitové kód a způsobit systému nárokovat nebo uvolnění Win16Mutex nelze prostřednictvím thunks trasování WinDBG a ladicí program Microsoft Visual C++. K trasování až thunk musíte použít ladicí program úrovni systému například WDEB386.EXE. Hlavní nedostatky pomocí WDEB386.EXE jsou potřebujete znát jazyk sestavení Intel x 86 vědět, jak pracovat mikroprocesory Intel x 86 a pamatovat mnoho ladicí program příkazy.

Nejlepší strategií používat

Nejlepší strategii pro ladění thunks je rozdělit a dobývat, protože je relativně snadné a eliminuje většinu problémy před potřebujete trasování prostřednictvím kódu jazyka sestavení v ladicím programu úrovni systému. Plochý thunks jsou složeny z DLL systémem Win32 a systémem Win16 DLL, takže je možné testovat každý z těchto izolace před testování společně. Vytvořte aplikace založené na Win16 otestovat DLL založené Win16 a vytvořte aplikace založené na Win32 otestovat DLL systémem Win32. Tím umožňuje použít širokou škálu ladicích nástrojů a ověřte, zda každou stranu pracuje správně.

Předběžná kontrolní seznam - před kompilace s kompilátorem jádro

Po ověření správně funguje každou stranu je čas umístit dvě společně k testování thunk samotného. Před kompilovat thunk s kompilátorem thunk zkontrolujte Předběžná kontrola následující položky:
  1. V thunk skript zkontrolujte, zda má každé funkci správné číslo a typy parametrů. Také zkontrolujte typy parametrů jsou podporovány kompilátor thunk. Pokud nejsou, bude mít nějakým způsobem změňte parametr k předání dat podporovaného typu.
  2. Jakékoli struktury předat jako parametry, zkontrolujte, použít stejnou strukturu balení v DLL systémem Win32, založené na Win16 DLL a skript thunk. Struktura dodacího nastavíte v C/C++ kompilátoru příkazového řádku a v thunk kompilátoru příkazového řádku. Všimněte si, že je přepínač dodacího kompilátor thunk pro 16bitové straně malých a velkých pro 32bitové straně.
  3. Ujistěte se, že nejste thunking do funkce jsou exportována správně a použít PASCAL, pokud nejste 32bitové voláním konvence, pokud nejste 16bitové nebo _stdcall. Kompilátor thunk nepodporuje _cdecl a __fastcall konvence volání.
  4. Ujistěte se, že DLL systémem Win32 volání ThunkConnect32() při každém jeho DllMain() funkce je volána. Podobně zkontrolujte, zda má DLL založené Win16 exportované funkce DllEntryPoint(), odděleně od jeho LibMain(), která volá ThunkConnect16() a vrátí hodnotu PRAVDA, pokud ThunkConnect16() úspěšné.

    Poznámka: je ve skutečnosti XXX_ThunkConnect16() a volání XXX_ThunkConnect32() kde XXX je symbol definovat s přepínačem -t kompilátor thunk. Kód generovaný kompilátorem thunk používá tyto symboly ke generování tabulek ThunkConnect16() a ThunkConnect32 volání.
  5. Přesvědčte se, zda hodnota zadaná v přepínač -t thunk kompilátoru příkazového řádku je stejné pro Win32 a Win16 thunk dll. Hodnota musí odpovídat také předponu ThunkConnect volání v DLL systémem Win16 a Win32 (viz Poznámka v kroku 4).
  6. Ověřte, zda má DLL založené Win16 DLLEntryPoint exportovány RESIDENTNAME klíčové slovo v jeho souboru modulu definice (.DEF). Bez klíčového slova RESIDENTNAME ThunkConnect32/ThunkConnect16 volání se nezdaří a nebude načten dll.
  7. Ověřte, zda má DLL 16bitového XXX_ThunkData16 exportovány RESIDENTNAME klíčové slovo v jeho souboru modulu definice (.DEF).
  8. V vaše založené Win16 DLL's makefile ověřte, že kompilátor prostředku označení DLL jako 4.0. Pokud je označeno menší než 4.0, nelze načíst a thunk nezdaří.
  9. Pokud funkce 32 bit 16bitové thunk vrací ukazatel, ujistěte se, že je základní typ stejnou velikost obou stranách 16bitové a 32bitové thunk. Pokud je velikost základní typ liší, potom kompilátor thunk vydá chybová zpráva informující, "Ukazatelů na non identické typy nelze vrátit." Vrátit ukazatel různé, ale kompatibilní, datový typ je jeden způsob, jak tento problém vyřešit. Například thunk nelze vrátíte ukazatel int protože int je na straně 16bitové ale čtyři bajty na straně 32bitové dva bajty. Změňte návratový typ thunk z ukazatel int na ukazatel dlouhé v thunk skript a kód původu dll systémem Win16 a Win32.

    Pokud zápis thunk 16 bit 32bitové, které vrátí ukazatel, kompilátor thunk problémy chybová zpráva oznamující, "ukazatel typy pravděpodobně nejsou k dispozici." Kompilátor thunk neumožňuje thunks 16 bit 32bitové vrátit typy ukazatel, protože jakmile thunk vrátil z funkce 32bitové, ukazatel není přejděte na data v prostoru adres správné proces systému Win32. Důvodem je, že mezery adresu všechny procesy systémem Win32 používat stejný rozsah adres a jsou preemptively kontextu přepínáním.
  10. Pokud linker hlásí chybu "nevyřešené externí" a symbol je název funkce, která je zadána konzistentně v celé všechny zdrojový kód, ujistěte se, že jsou všechny výskyty jeho prototyp konzistentní soubory definice modulu a skript thunk. Na straně Win32 thunk funkce musí být deklarována s typem __stdcall; na straně Win16 musí být deklarován funkce s typem PASCAL. V projektech C++ nezapomeňte deklarovat a definovat obě strany funkce thunk s externí "C" propojení specifikátor navíc k __stdcall nebo typ PASCAL.

Trouble-Shooting programu – po kompilace s kompilátorem jádro

Po kontrole preliminaries sestavení thunk dll a zkuste spustit je. Pokud jejich spouštění pokračujte dále testování, zkontrolujte, zda jsou právě uvolněte plné. Pokud není spouštějí použít následující Příručka pro řešení potíží zjistit a vyřešit příčinu problému.

ThunkConnect16() v Win16 nebo ThunkConnect32() v straně Win32 nezdaří:

  1. Spustit ladicí verze systému dll. Ladicí verze KERNEL32.DLL a KRNL386.EXE obsahovat mnoho diagnostických zpráv zjistit proč nebyl inicializován thunk. Spustit ladicí verze systému dll, použijte ikonu "Přepnout k ladění dll" v nabídce Start v části nástroje Win32 SDK. Použít "přepnout do jiné ladění dll" přepnout zpět na prodejní verzi.
  2. Ověřte, zda má volání ThunkConnect16() DLL založené Win16 a DLL systémem Win32 má odpovídající volání ThunkConnect32(). Pokud jednu z těchto chybí, pak druhý se nezdaří a načtení thunk dll se nezdaří.
  3. Vložte zarážky v DllMain() Win32 DLL a v DllEntryPoint() a LibMain() Win16 DLL funkce viz DLL, které není načítání.
Pokud ThunkConnect16() a ThunkConnect32() volání pracují správně, ale stále není thunk, je čas zjednodušit vaše thunk. To může ve skutečnosti útoku dvěma způsoby. Odebráním parametry z thunk postupně a recompiling jej nejdříve spustit. Nebo, druhé, vytvořit jednoduchý thunk, pracuje a vytvořit jej až selže podle následujících kroků:
  1. Vytvořit jednoduchý thunk a spustit jej stejně zkontrolujte, zda máte správně nastaven mechanismus thunk. Je vhodná pro jednoduché thunk funkci s žádné vrácenou hodnotu a žádné parametry. Pokud nefunguje i jednoduché thunk spustit prostřednictvím Předběžná kontrolní výše ověřte, zda máte správně nastaven věci. Potom pokračujte krokem 2.
  2. Zkontrolujte, zda cílové DLL a jakékoli dll spoléhá na můžete nalézt a načten. Pokud chybí jedna nebo zavaděč nenalezne, nebude fungovat thunk.
  3. Zkontrolujte, zda cílový DLL není způsobem něco nelze v kontextu thunk.
Jakmile máte zjednodušené thunk, pracuje, ale skutečné thunk stále nefunguje, postupujte takto:
  1. Přidat parametry do jednoduché thunk jednu chvíli chcete-li zjistit, zda je parametr příčinou selhání. Pokud jedna, ujistěte se, parametr je správným typem je funkce deklarována a definované s stejné číslo a typy parametrů v obou dll a kompilátor thunk a funkce je deklarována jako PASCAL nebo _stdcall.
  2. Pokud cílový DLL je založen Win16 DLL a nemůže získat přístup jeho globální nebo statická data, ujistěte se, že jste funkci exportována správně. Pokud použijete přepínač /GD s Visual C++, musíte deklarovat a definovat funkci s klíčové slovo __export DLL založené Win16 zdrojový kód. Právě výpis název funkce v DLL souboru definice (.DEF) modulu není dostatek, protože kompilátor nezpracovává souboru .DEF, takže nebude generovat prologu a kód epilog exportované funkce vyžadují.
  3. Volání LocalAlloc() v vaše cíle založené Win16 DLL příčina obecné ochrany (GP) chyby, zkontrolujte, zda je vaše funkce exportován popsaný v kroku 2.
  4. Pokud GP poruchy v KERNEL32 získat pouze po cílové založené Win16 funkce vrátí, ujistěte se, deklarován a definován jako PASCAL funkce cíl. C konvence volání nelze použít. Ačkoli neobvyklé v kódu C nebo C++, ale pravděpodobnější v jazyce sestavení Ujistěte se, že funkce cílové nemělo upravit DS, SS, BP SI nebo DI Registry.
  5. Získat GP poruchy v thunk 32bitové DLL nebo KERNEL32 bezprostředně po vaší systémem Win32 cílové funkce vrátí, zkontrolujte, zda deklarována jako cílovou funkci jako _stdcall a ji neměl měnit Registry DS, ES, FS, SS, EBP, EBX, ESI nebo EDI. Kód C nebo C++ neměl způsobit Registry být změněna, ale má kód jazyka sestavení pečlivě zkontrolovat.
  6. Pokud vaše Win16 založené na cílové funkce vrátí neplatné umístění Zkontrolujte deklaraci a definován jako FAR. To je důležité zejména pro malé modelu DLL; funkce v DLL střední a velké modelu jsou ve výchozím nastavení FAR.
  7. Pokud dochází k GP poruchy v založené Win16 funkce při přístupu k více než 64 kB data z ukazatel předaný jako parametr (tj thunked ukazatel), je třeba přidělit matici dlaždicích voliče popsané v následujícím článku databáze Microsoft Knowledge Base:
    132005DOCERR: Neúplná dokumentace AllocSelector & FreeSelector
    Na straně Win16 thunked ukazatele vždy skládají z jednoho volič s limit 64 kB, což znamená, že je nelze použít jako velmi velké ukazatelů. Celý původní oblast dat, která řeší ukazatel je přístupný cílové založené Win16 DLL - ale pouze vytvoří matici dlaždicích voliče odkazovat jej a používá velmi velké ukazatel proměnných přístup k datům.
  8. Zkontrolujte, zda používáte thunked ukazatel pouze v kontextu thunk. Voliče vyčleněné thunk kompilátoru pro použití podle založené Win16 cílů jsou uvolněna jako vrátí thunk.
  9. Zarážky umístit na začátek funkce cílové zda právě získávání do nich. Pokud jsou, a jste laděn straně cílové nezávisle thunk použitá uvnitř cíl, je pravděpodobné dobré, je cíl způsobem něco nelze provést thunk nebo odkazující paměti neexistuje. Naleznete v části kroky 7 a 8.

Vlastnosti

ID článku: 133722 - Poslední aktualizace: 11. července 2005 - Revize: 2.3
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Platform Software Development Kit-January 2000 Edition na těchto platformách
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Klíčová slova: 
kbmt kbhowto kbkernbase kbprogramming KB133722 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:133722

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com