Udostępnij przez


Punkty przerwania procesora (ba breakpoints)

Punkty przerwania kontrolowane przez procesor w żądaniu debugera są nazywane punktami przerwania procesora lub punktami przerwania danych. Punkty przerwania kontrolowane bezpośrednio przez debuger są nazywane punktami przerwania oprogramowania.

Uwaga Chociaż termin przełamanie danych jest często używany jako synonim przełamanie procesora, ten termin może być mylący. Istnieją dwa podstawowe typy punktów przerwania: punkty przerwania procesora, które są kontrolowane przez procesor i punkty przerwania oprogramowania, które są kontrolowane przez debuger. Punkty przerwania procesora są zwykle ustawiane na danych programu — jest to powód, dla którego są nazywane "punktami przerwania danych", ale można je również ustawić w kodzie wykonywalnym. Punkty przerwania oprogramowania są zwykle ustawiane w kodzie wykonywalny, ale można je również ustawić na danych programu. Niestety, często w literaturze debugowania można odwoływać się do punktów przerwania procesora jako "punktów przerwania danych", nawet jeśli są one ustawione w kodzie wykonywalnym.

Punkty przerwania procesora

Punkt przerwania procesora jest wyzwalany, gdy dostępna jest określona lokalizacja pamięci. Istnieją cztery typy punktów przerwania procesora odpowiadające rodzajowi dostępu do pamięci, który go wyzwala:

Typ punktu przerwania Akcja
e (wykonaj) Wyzwalane, gdy procesor pobiera instrukcję z określonego adresu.
r (odczyt/zapis) Wyzwalane, gdy procesor odczytuje lub zapisuje pamięć pod określonym adresem.
w (zapisz) Wyzwalane, gdy procesor zapisuje pamięć pod określonym adresem.
i (i/o - wejście/wyjście) Wyzwalane, gdy jest uzyskiwany dostęp do portu we/wy w określonym adresie.

Każdy punkt przerwania procesora ma skojarzony z nim rozmiar. Na przykład punkt przerwania procesora w (zapis) można ustawić pod adresem 0x70001008 o rozmiarze czterech bajtów. Umożliwiałoby to monitorowanie blokady adresów z 0x70001008 do 0x7000100B włącznie. Jeśli ten blok pamięci zostanie zapisany, punkt przerwania zostanie wyzwolony.

Może się zdarzyć, że procesor wykonuje operację w regionie pamięci, który nakłada się na siebie, ale nie jest identyczny z określonym regionem. W przykładzie podanym w poprzednim akapicie pojedyncza operacja zapisu zawierająca zakres 0x70001000 0x7000100F lub operacja zapisu obejmująca tylko bajt w 0x70001009, byłaby operacją nakładającą się. Czy w takiej sytuacji dochodzi do wyzwolenia punktu przerwania, zależy od procesora. Aby uzyskać szczegółowe informacje na temat sposobu obsługi tej sytuacji na określonym procesorze, zapoznaj się z podręcznikiem architektury procesora i poszukaj "rejestru debugowania" lub "rejestru sterowania debugowaniem". Aby podjąć jeden konkretny typ procesora jako przykład, na procesorze x86 wyzwalany jest punkt przerwania odczytu lub zapisu za każdym razem, gdy dostępny zakres nakłada się na zakres punktów przerwania.

Podobnie, jeśli na adresie 0x00401003 jest ustawiony punkt przerwania e (wykonaj), a następnie jest wykonywana instrukcja dwu bajtowa obejmująca adresy 0x00401002 i 0x00401003, wynik jest zależny od procesora. Ponownie zapoznaj się z podręcznikiem architektury procesora, aby uzyskać szczegółowe informacje.

Procesor rozróżnia punkty przerwania ustawione przez debuger trybu użytkownika i punkty przerwania ustawione przez debuger trybu jądra. Punkt przerwania procesora trybu użytkownika nie ma wpływu na żadne procesy trybu jądra. Punkt przerwania procesora w trybie jądra może, ale nie musi, wpływać na proces w trybie użytkownika, w zależności od tego, czy kod w trybie użytkownika korzysta ze stanu rejestrów debugowania i czy debuger trybu użytkownika jest dołączony.

Aby zastosować istniejące punkty przerwania danych bieżącego procesu do innego kontekstu rejestru, użyj polecenia .apply_dbp (Zastosuj punkt przerwania danych do kontekstu).

Na komputerze wieloprocesorowym każdy punkt przerwania procesora ma zastosowanie do wszystkich procesorów. Jeśli na przykład bieżący procesor ma wartość 3 i używasz polecenia ba e1 MyAddress , aby umieścić punkt przerwania w usłudze MyAddress, każdy procesor — nie tylko procesor 3 — który wykonuje na tym adresie wyzwala punkt przerwania. Dotyczy to również punktów przerwania oprogramowania.

Punkty przerwania oprogramowania

Punkty przerwania oprogramowania, w przeciwieństwie do punktów przerwania procesora, są kontrolowane przez debuger. Gdy debuger ustawia punkt przerwania oprogramowania w określonej lokalizacji, tymczasowo zastępuje zawartość tej lokalizacji pamięci instrukcją przerwania. Debuger zapamiętuje oryginalną zawartość tej lokalizacji, tak aby jeśli ta pamięć jest wyświetlana w debugerze, debuger wyświetli oryginalną zawartość tej lokalizacji pamięci, a nie instrukcję przerwania. Gdy proces docelowy wykonuje kod w tej lokalizacji, instrukcja przerwania powoduje przerwanie procesu i przejście do debugera. Po wykonaniu dowolnej wybranej akcji możesz spowodować wznowienie wykonywania celu, a wykonanie zostanie wznowione z tą samą instrukcją, która pierwotnie znajdowała się w tej lokalizacji.

Dostępność typów punktów przerwania procesora

Opcja i (i/o) jest dostępna tylko podczas debugowania w trybie jądra.

Nie wszystkie rozmiary danych mogą być używane ze wszystkimi typami punktów przerwania procesora. Dozwolone rozmiary zależą od procesora komputera docelowego. Aby uzyskać szczegółowe informacje, zobacz ba (Break on Access).

Ograniczenia punktów przerwania oprogramowania i punktów przerwania procesora

Można określić adres danych, a nie adres programu podczas korzystania z bp lub bm /a poleceń. Jednak nawet jeśli określono lokalizację danych, te polecenia tworzą punkty przerwania oprogramowania, a nie punkty przerwania procesora. Gdy debuger umieszcza punkt przerwania oprogramowania w określonej lokalizacji, tymczasowo zastępuje zawartość tej lokalizacji pamięci instrukcją przerwania. Nie powoduje to uszkodzenia obrazu wykonywalnego, ponieważ debuger zapamiętuje oryginalną zawartość tej lokalizacji, a gdy proces docelowy próbuje wykonać ten kod, debuger może odpowiednio odpowiedzieć. Jednak gdy punkt przerwania oprogramowania jest ustawiony w lokalizacji danych, wynikowe zastąpienie może prowadzić do uszkodzenia danych. W związku z tym ustawienie punktu przerwania oprogramowania w lokalizacji danych jest bezpieczne tylko wtedy, gdy masz pewność, że ta lokalizacja będzie używana tylko jako kod wykonywalny.

Polecenia bp, bu i bm ustawiają punkty przerwania oprogramowania, zastępując instrukcję procesora instrukcją przerwania. W związku z tym nie można ich używać w kodzie tylko do odczytu ani w innym kodzie, którego nie można zastąpić. Aby ustawić punkt przerwania w takim kodzie, należy użyć opcji ba (Break on Access) z opcją e (execute).

Nie można utworzyć wielu punktów przerwania procesora pod tym samym adresem, które różnią się tylko w poleceniu, które jest wykonywane automatycznie po wyzwoleniu punktu przerwania. Można jednak utworzyć wiele punktów przerwania pod tym samym adresem, które różnią się innymi ograniczeniami (na przykład można utworzyć wiele punktów przerwania pod tym samym adresem przy użyciu polecenia ba z różnymi wartościami opcji /p, /t, /c i /C ).

Początkowy punkt przerwania w procesie trybu użytkownika (zazwyczaj ustawiony na głównej funkcji lub jej odpowiedniku) nie może być punktem przerwania procesora.

Liczba obsługiwanych punktów przerwania procesora zależy od architektury procesora docelowego.

Kontrolowanie punktów przerwania oprogramowania i punktów przerwania procesora

Punkty przerwania oprogramowania można tworzyć za pomocą poleceń bp (Ustaw punkt przerwania),bm (Ustaw punkt przerwania w symbolach), i bu (Ustaw punkt przerwania w przypadku nierozstrzygniętego). Punkty przerwania procesora można utworzyć za pomocą polecenia ba (Break on Access). Polecenia, które wyłączają, włączają i modyfikują punkty przerwania, mają zastosowanie do wszystkich rodzajów punktów przerwania. Polecenia, które wyświetlają listę punktów przerwania, obejmują wszystkie punkty przerwania i wskazują typ każdego z nich. Aby uzyskać listę tych poleceń, zobacz Metody kontrolowania punktów przerwania.

W oknie dialogowym Punkty przerwania w programie WinDbg wyświetlane są wszystkie punkty przerwania, przy czym punkty przerwania procesora są oznaczane notacją "e", "r", "w" lub "i", po których podany jest rozmiar bloku. To okno dialogowe może służyć do modyfikowania dowolnego punktu przerwania. Pole tekstowe Polecenie w tym oknie dialogowym może służyć do tworzenia dowolnego typu punktu przerwania. Jeśli żądany jest punkt przerwania procesora, rozpocznij dane wejściowe za pomocą ciągu "ba". Po ustawieniu punktu przerwania przy użyciu myszy w oknie dezasemblacji WinDbg lub oknie źródła debuger tworzy nierozwiązany punkt przerwania oprogramowania.

Punkty przerwania procesora są przechowywane w rejestrach debugowania procesora. Istnieje możliwość ustawienia punktu przerwania przez ręczne edytowanie wartości rejestru debugowania, ale jest to zdecydowanie niezalecone.