Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podczas debugowania w trybie użytkownika aktywujesz, wyświetlasz, blokujesz, wznawiasz, zawieszasz i wznawiasz procesy i wątki.
Bieżący lub aktywny proces to proces, który jest obecnie debugowany. Podobnie bieżący lub aktywny wątek jest wątkiem, który aktualnie kontroluje debuger. Akcje wielu poleceń debugera są określane przez tożsamość bieżącego procesu i wątku. Bieżący proces określa również mapowania wirtualnych adresów używanych przez debuger.
Po rozpoczęciu debugowania bieżący proces jest tym, do którego jest dołączony debuger lub który spowodował wyjątek, który włamał się do debugera. Podobnie, bieżący wątek to ten, który był aktywny, gdy debuger został dołączony do procesu lub gdy spowodował wyjątek. Można jednak użyć debugera, aby zmienić bieżący proces i wątek oraz zablokować lub odblokować poszczególne wątki.
W debugowaniu w trybie jądra procesy i wątki nie są kontrolowane przez metody opisane w tej sekcji. Aby uzyskać więcej informacji na temat sposobu manipulowania procesami i wątkami w trybie jądra, zobacz Zmienianie kontekstów.
Wyświetlanie procesów i wątków
Aby wyświetlić informacje o procesie i wątku, można użyć następujących metod:
| (Stan procesu) polecenie
Polecenie ~ (stan wątku)
(Tylko WinDbg) Okno Procesów i Wątków
Ustawianie bieżącego procesu i wątku
Aby zmienić bieżący proces lub wątek, można użyć następujących metod:
Polecenie |s (Ustaw bieżący proces)
(Tylko WinDbg) Okno Procesy i Wątki
Zamrażanie i zawieszanie wątków
Debuger może zmienić wykonywanie wątku, zawieszając wątek lub zamrażając wątek. Te dwie akcje mają nieco inne skutki.
Każdy wątek ma liczbę wstrzymania , która jest z nią skojarzona. Jeśli ta liczba jest jedną lub większą, system nie uruchamia wątku. Jeśli liczba jest równa zero lub niższa, system uruchamia wątek, jeśli jest to konieczne.
Zwykle każdy wątek ma licznik zawieszenia równy zero. Gdy debuger dołącza do procesu, zwiększa liczniki zawieszeń wszystkich wątków w tym procesie o jeden. Jeśli debuger odłącza się od procesu, dekrementuje wszystkie liczniki wstrzymania o jeden. Gdy debuger wykonuje proces, tymczasowo zmniejsza wszystkie liczniki zatrzymania o jeden.
Licznik wstrzymań dowolnego wątku w debugerze można kontrolować przy użyciu następujących metod:
Polecenie ~n (Wstrzymaj wątek) zwiększa liczbę wstrzymania określonego wątku o jeden.
Polecenie ~m (Wznów wątek) dekrementuje liczbę wstrzymania określonego wątku o jeden.
Najczęstszym zastosowaniem dla tych poleceń jest zwiększenie liczby zawieszeń określonego wątku z jednego na dwa. Gdy debuger wykonuje proces lub odłącza się od niego, wątek ma licznik wstrzymania o wartości jeden i pozostaje zawieszony, nawet jeśli inne wątki w procesie są wykonywane.
Wątki można zawiesić nawet wtedy, gdy wykonujesz debugowanie nieinwazyjne.
Debuger może również zablokować wątek. Ta akcja jest podobna do zawieszania wątku na kilka sposobów. Jednak ustawienie "zamrożone" jest tylko ustawieniem debugera. Nic w systemie operacyjnym Windows nie rozpoznaje, że ten wątek jest inny.
Domyślnie wszystkie wątki są niezamrożne. Gdy debuger powoduje wykonanie procesu, wątki, które są zamrożone, nie są wykonywane. Jeśli jednak debuger odłącza się od procesu, wszystkie wątki zostają odmrożone.
Aby zablokować i odblokować poszczególne wątki, można użyć następujących metod:
Polecenie ~f (Freeze Thread) zawiesza określony wątek.
Polecenie ~u (Odmroź wątek) odmraża określony wątek.
W każdym przypadku wątki należące do procesu docelowego nigdy nie są wykonywane, kiedy debuger przerwał działanie procesu docelowego. Licznik wstrzymania wątku ma wpływ na jego zachowanie tylko wtedy, gdy debuger uruchamia proces lub go odłącza. Stan zamrożony wpływa na zachowanie wątku tylko wtedy, gdy debuger wykonuje proces.
Wątki i procesy w innych poleceniach
Specyfikatory wątku lub specyfikatory procesów można dodawać przed wieloma innymi poleceniami. Aby uzyskać więcej informacji, zobacz poszczególne tematy poleceń.
Przed wieloma poleceniami i rozszerzeniami można dodać kwalifikator ~e (Thread-Specific Command ). Ten kwalifikator powoduje wykonanie polecenia w odniesieniu do określonego wątku. Ten kwalifikator jest szczególnie przydatny, jeśli chcesz zastosować polecenie do więcej niż jednego wątku. Na przykład następujące polecenie powtarza polecenie rozszerzenia !gle dla każdego wątku, który jest debugowany.
~*e !gle
Wiele systemów
Debugger może podłączać się do wielu celów jednocześnie. Gdy te procesy obejmują pliki zrzutu lub zawierają obiekty docelowe na żywo na więcej niż jednym komputerze, debuger odwołuje się do systemu, procesu i wątku dla każdej akcji. Aby uzyskać więcej informacji na temat tego rodzaju debugowania, zobacz Debugowanie wielu obiektów docelowych.