Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Mnoho ovladačů dodává rutiny zpětného volání kontroly chyb. Když Systém Windows vydá kontrolu chyb, zavolá tyto rutiny před vypnutím systému. Tyto rutiny mohou určovat a zapisovat do oblastí paměti označovaných jako data zpětného volání a sekundární data zpětného volání.
Použití funkce BugCheckCallbackKBUGCHECK_CALLBACK_ROUTINE
Data zapsaná touto rutinou se stanou součástí dat zpětného volání. Data nejsou zahrnuta do souboru s výpisem stavu systému.
Použití funkce BugCheckSecondaryDumpDataCallbackKBUGCHECK_REASON_CALLBACK_ROUTINE
Data zapsaná touto rutinou se stanou součástí sekundárních dat zpětného volání. Data jsou součástí souboru s výpisem stavu systému.
BugCheckAddPagesCallback používá KBUGCHECK_REASON_CALLBACK_ROUTINE
Stránky určené touto rutinou se stanou součástí dat zpětného volání. Data na těchto stránkách jsou součástí souboru s výpisem stavu systému.
Množství dat zpětného volání a sekundárního zpětného volání, která jsou k dispozici pro ladicí program, závisí na několika faktorech:
Pokud provádíte živé ladění systému s chybovým ukončením, budou k dispozici data zpětného volání, která již byla napsána funkcí BugCheckCallback nebo specifikována funkcí BugCheckAddPagesCallback. Sekundární data zpětného volání nebudou k dispozici, protože nejsou uložená v žádném pevném umístění paměti.
Pokud ladíte kompletní výpis paměti nebo výpis paměti jádra, budou k dispozici data zpětného volání zadaná BugCheckAddPagesCallback a sekundární data zpětného volání zapsaná BugCheckSecondaryDumpDataCallback. Data zpětného volání zapsaná pomocí BugCheckCallback nebude k dispozici.
Pokud ladíte malý výpis paměti, nebudou data zpětného volání k dispozici. Sekundární data pro zpětné volání budou k dispozici.
Další podrobnosti o různých velikostech souborů výpisu paměti najdete v části Kernel-Mode Výpisy paměti.
Zobrazení dat zpětného volání
Pokud chcete zobrazit data zpětného volání kontroly chyb, můžete použít rozšíření !bugdump .
Bez parametrů zobrazí !bugdump data pro všechny zpětná volání.
Chcete-li zobrazit data pro jednu konkrétní rutinu zpětného volání, použijte !bugdumpComponent, kde Component je stejný parametr, který byl předán KeRegisterBugCheckCallback při registraci této rutiny.
Zobrazení sekundárních dat zpětného volání
Existují dvě metody zobrazení sekundárních dat zpětného volání. Můžete použít příkaz .enumtag nebo můžete napsat vlastní rozšíření ladicího programu.
Každý blok sekundárních dat zpětného volání je identifikován značkou GUID. Tuto značku určuje pole Guid parametru (KBUGCHECK_SECONDARY_DUMP_DATA)ReasonSpecificData předaného do BugCheckSecondaryDumpDataCallback.
Příkaz .enumtag (Enumerate Secondary Callback Data) není velmi přesný nástroj. Zobrazí každý sekundární datový blok se značkou a poté data v šestnáctkovém a ASCII formátu. Obecně je užitečné určit, které značky se ve skutečnosti používají pro sekundární datové bloky.
Pokud chcete tato data používat praktičtějším způsobem, doporučujeme napsat vlastní rozšíření ladicího programu. Toto rozšíření musí volat metody v hlavičkovém souboru „dbgeng.h“. Podrobnosti najdete v tématu Psaní nových rozšíření ladicího programu.
Pokud znáte značku GUID sekundárního datového bloku, vaše rozšíření by mělo použít metodu IDebugDataSpaces3::ReadTagged pro přístup k datům. Prototyp je následující:
STDMETHOD(ReadTagged)(
THIS_
IN LPGUID Tag,
IN ULONG Offset,
OUT OPTIONAL PVOID Buffer,
IN ULONG BufferSize,
OUT OPTIONAL PULONG TotalSize
) PURE;
Tady je příklad použití této metody:
UCHAR RawData[MY_DATA_SIZE];
GUID MyGuid = .... ;
Success = DataSpaces->ReadTagged( &MyGuid, 0, RawData,
sizeof(RawData), NULL);
Pokud zadáte velikost vyrovnávací paměti, která je příliš malá, ReadTagged bude úspěšný, ale zapíše pouze požadovaný počet bajtů do vyrovnávací paměti. Pokud zadáte BufferSize, která je příliš velká, ReadTagged bude úspěšný, ale zapíše pouze skutečnou velikost bloku do Buffer. Pokud zadáte ukazatel pro TotalSize, ReadTagged ho použije k vrácení velikosti skutečného bloku. Pokud k bloku nelze získat přístup, funkce ReadTagged vrátí stavový kód selhání.
Pokud mají dva bloky identické značky GUID, vrátí se první odpovídající blok a druhý blok bude nepřístupný.
Pokud si nejste jistí značkou GUID bloku, můžete použít IDebugDataSpaces3::StartEnumTagged, IDebugDataSpaces3::GetNextTagged a IDebugDataSpaces3::EndEnumTagged metody výčet označených bloků. Jejich prototypy jsou následující:
STDMETHOD(StartEnumTagged)(
THIS_
OUT PULONG64 Handle
) PURE;
STDMETHOD(GetNextTagged)(
THIS_
IN ULONG64 Handle,
OUT LPGUID Tag,
OUT PULONG Size
) PURE;
STDMETHOD(EndEnumTagged)(
THIS_
IN ULONG64 Handle
) PURE;
Odlaďování rutin zpětného volání
Je také možné ladit samotnou rutinu zpětného volání. Zarážky v rutinách zpětného volání fungují stejně jako všechny ostatní zarážky.
Pokud rutina zpětného volání způsobí druhou kontrolu chyb, tato nová kontrola chyb se zpracuje jako první. Systém Windows však nebude opakovat některé části procesu Zastavení – například nezapíše druhý soubor s výpisem stavu systému. Kód Stop zobrazený na modré obrazovce bude druhým kódem kontroly chyb. Pokud je ladicí program jádra připojený, obvykle se zobrazí zprávy o obou kontrolách chyb.