Sdílet prostřednictvím


Řízení vláken a procesů

Přehled vláken a procesů v modulu ladicího programu naleznete v tématu Vlákna a procesy.

Když dojde k události, vlákno události a proces události jsou nastaveny na vlákno a proces (operační systém nebo virtuální), ve kterém došlo k události. Lze je najít pomocí metody GetEventThread a GetEventProcess.

Implicitní vlákna a procesy

V ladění v režimu jádra modul ladicího programu použije implicitní proces k určení virtuálního adresního prostoru, který se má použít při provádění virtuálního překladu fyzických adres – například v metodách VirtualToPhysical a ReadVirtual. Když dojde k události, implicitní proces je nastaven na aktuální proces.

Implicitní proces může být změněn pomocí SetImplicitProcessDataOffset. K určení implicitního procesu použijte GetImplicitProcessDataOffset.

Poznámka Když nastavíte zarážky během živé relace ladění jádra, modul ladicího programu předá do cíle virtuální adresu zarážky a cíl nastaví zarážku. V tomto případě se při zpracování zarážky použije pouze kontext procesu cílového; hodnota implicitního procesu je irelevantní.

V ladění v režimu jádra modul ladicího programu použije implicitní vlákno k určení některých registrů cíle. To zahrnuje zásobník procesoru (viz GetStackOffset), posun rámce (viz GetFrameOffset) a posun instrukce (viz GetInstructionOffset). Když dojde k události, implicitní vlákno je nastaveno na aktuální vlákno.

Implicitní vlákno může být změněno pomocí SetImplicitThreadDataOffset. K určení implicitního vlákna použijte GetImplicitThreadDataOffset.

Ne všechny registry jsou určeny implicitním vláknem. Některé registry zůstanou při změně implicitního vlákna stejné.

Varování Implicitní proces a implicitní vlákno jsou nezávislé. Pokud implicitní vlákno nepatří do implicitního procesu, bude stav uživatele a relace pro implicitní vlákno v nesprávném virtuálním adresní prostoru a pokusy o přístup k této informace způsobí chyby nebo poskytnou nesprávné výsledky. K tomuto problému nedochází při přístupu k paměti jádra, protože adresy paměti jádra jsou konstantní ve všech virtuálních adresních prostorech. Proto mohou být informace pro implicitní vlákno umístěné v paměti jádra přístupné nezávisle na implicitní procesu.

Nitě

ID vlákna motoru používá ladicí modul k identifikaci každého vlákna operačního systému a každého virtuálního vlákna pro cíl.

Když je cíl zastaven, každé vlákno má také index vzhledem k procesu, ke kterému patří. U jakéhokoli procesu je index prvního vlákna v procesu nula a index posledního vlákna je počet vláken v procesu minus jeden. Počet vláken v aktuálním procesu lze najít pomocí GetNumberThreads. Celkový počet vláken ve všech procesech v aktuálním cíli lze najít pomocí metody GetTotalNumberThreads.

ID vlákna motoru a ID systémového vlákna pro jedno nebo více vláken v aktuálním procesu lze najít z jejich indexu pomocí GetThreadIdsByIndex.

Modul udržuje několik informací o jednotlivých vláknech. Tyto informace mohou být zjištěny pro aktuální vlákno a mohou být použity k nalezení ID vlákna stroje.

ID systémového vlákna (pouze ladění v uživatelském režimu)
ID systémového vlákna aktuálního vlákna lze najít pomocí GetCurrentThreadSystemId. Pro dané ID systémového vlákna může být nalezeno odpovídající ID vlákna modulu pomocí GetThreadIdBySystemId.

blok prostředí vlákna (TEB)
Adresu TEB pro aktuální vlákno lze najít pomocí GetCurrentThreadTeb. Pro danou adresu TEB může být nalezeno odpovídající ID vlákna pomocí GetThreadIdByTeb. Při ladění v režimu jádra je TEB (v případě virtuálního vlákna) TEB systémového vlákna, které běželo na odpovídajícím procesoru, když nastala poslední událost.

posun datového indexu
Při ladění v uživatelském režimu je offset dat vlákna (systému) umístění TEB pro toto vlákno. Při ladění v režimu jádra je offset dat (virtuálního) vlákna struktura KTHREAD pro systémové vlákno, které běželo na odpovídajícím procesoru, když nastala poslední událost. Posun dat aktuálního vlákna lze najít pomocí GetCurrentThreadDataOffset. Pro daný posun dat může být odpovídající ID vlákna procesu nalezeno pomocí GetThreadIdByDataOffset.

systémová rukojeť
Systémový popisovač aktuálního vlákna lze najít pomocí GetCurrentThreadHandle. Pro daný systémový popisovač lze najít odpovídající ID vlákna prostřednictvím GetThreadIdByHandle. V ladění v režimu jádra se pro každý (virtuální) proces vytvoří umělý popisovač. Tento popisovač lze použít pouze s dotazy API ladicího programu.

Procesy

ID procesu motoru používá ladicí engine k identifikaci každého procesu operačního systému a každého cílového virtuálního procesu.

Zatímco je cíl zastavený, každý proces má index vzhledem k cíli. Index prvního procesu v cíli je nula a index posledního procesu je počet procesů v cíli minus jeden. Počet procesů v aktuálním cíli lze najít pomocí GetNumberProcesses.

ID procesu stroje a ID systémového procesu pro jedno nebo více vláken v aktuálním cíli lze najít z jejich indexu pomocí GetProcessIdsByIndex.

Modul udržuje několik informací o každém procesu. Tyto informace mohou být získány pro aktuální proces a mohou být použity k vyhledání ID procesu jádra pro daný proces.

ID systémového procesu (pouze ladění v uživatelském režimu)
ID systémového procesu aktuálního procesu lze najít pomocí GetCurrentProcessSystemId. Pro dané ID systémového procesu může být odpovídající ID procesu modulu nalezeno pomocí GetProcessIdBySystemId.

procesní blok prostředí (PEB)
Adresu PEB pro aktuální proces lze najít pomocí GetCurrentProcessPeb. Pro danou adresu PEB lze příslušné ID procesu nalézt pomocí GetProcessIdByPeb. Při ladění v režimu jádra je PEB (virtuálního) procesu PEBem systémového procesu, který běžel v době, kdy došlo k poslední události.

datový offset
Při ladění v uživatelském režimu je datový posun procesu (systému) stanoven umístěním PEB tohoto procesu. V ladění v režimu jádra je posun dat (virtuálního) procesu dán strukturou KPROCESS pro systémový proces, který běžel, když nastala poslední událost. Posun dat aktuálního procesu lze najít pomocí GetCurrentProcessDataOffset. Pro daný posun dat může být odpovídající ID procesu systému nalezeno pomocí GetProcessIdByDataOffset.

systémová rukojeť
Systémový popisovač aktuálního procesu lze najít pomocí GetCurrentProcessHandle. Pro daný systémový popisovač lze najít odpovídající ID procesu modulu pomocí GetProcessIdByHandle. Při ladění v režimu jádra se pro virtuální proces vytvoří umělý popisovač. Tento popisovač lze použít pouze s dotazy stroje ladicího programu.

Dění

Při ladění v živém uživatelském režimu se při každém vytvoření nebo ukončení vlákna v daném cíli generují události ladění typu "create-thread" a "exit-thread". Tyto události vedou k volání IDebugEventCallbacks::CreateThread a IDebugEventCallbacks::ExitThread metody zpětného volání.

Při živém ladění v uživatelském režimu se při každém vytvoření nebo ukončení procesu v cíli vygenerují události ladění procesu vytvoření a ukončení procesu. Tyto události vedou k volání IDebugEventCallbacks::CreateProcess a IDebugEventCallbacks::ExitProcess metody zpětného volání.

Další informace o událostech naleznete v tématu Monitorování událostí.

Další informace

Další informace o vláknech a procesech, včetně struktur TEB, KTHREAD, PEB a KPROCESS, naleznete v tématu Interní funkce systému Microsoft Windows od David Solomon a Mark Russinovich.