Oprócz świetnych informacji @BenVoigt, pozwólcie mi dodać kilka rzeczy:
Punkt przerwania jest ustawiany przez debugger poprzez zamianę wartości kodu maszynowego (instrukcji lub części instrukcji) w procesie debugowanym na określoną instrukcję pułapki w miejscu w kodzie, który odpowiada żądanej linii (źródłowej) do złamania. Ta szczególna instrukcja pułapki ma służyć jako punkt przerwania - debugger wie o tym, podobnie jak system operacyjny.
Kiedy debugowany proces / wątek trafia w instrukcję pułapki, która uruchamia proces opisany przez @Ben, który obejmuje połowę zamiany kontekstu, która zawiesza aktualnie działający wątek (obejmujący zapisanie jego stanu procesora w pamięci) w celu potencjalnego późniejszego wznowienia. Ponieważ pułapka ta jest pułapką punktu przerwania, system operacyjny utrzymuje zawieszony proces debugowania za pomocą być może mechanizmu opisanego przez @Ben oraz powiadamia i ostatecznie wznawia debugger.
Debuger używa następnie wywołań systemowych, aby uzyskać dostęp do zapisanego stanu zawieszonego procesu / wątku, który jest debugowany.
Aby wykonać (wznowić) wiersz kodu, który się zepsuł (który ma teraz konkretną instrukcję pułapki), debugger przywróci oryginalną wartość kodu maszynowego, którą zastąpił instrukcją pułapki punktu przerwania, ewentualnie ustawi inną pułapkę gdzie indziej (np. W przypadku pojedynczego kroku, lub użytkownik tworzy nowe punkty przerwania) i oznaczy proces / wątek jako uruchamialny, być może używając mechanizmu opisanego przez @Ben.
Rzeczywiste szczegóły mogą być bardziej skomplikowane, ponieważ utrzymywanie długo działającego punktu przerwania, który został trafiony, oznacza zrobienie czegoś takiego jak zamiana pułapki punktu przerwania na prawdziwy kod, aby linia mogła działać, a następnie zamiana punktu przerwania z powrotem ...
Czy te rejestry nie są stale używane przez inne procesy systemu operacyjnego? jak się nie nadpisują?
Jak opisuje @Ben, użycie już istniejącej funkcji zawieszenia / wznowienia wątku (przełączanie kontekstu / zamiana wielozadaniowości ), która pozwala procesorom współdzielić wiele procesów / wątków z wykorzystaniem podziału czasu.
Czy to tylko migawka zawartości, a nie danych na żywo?
To jest jedno i drugie. Ponieważ wątek uderzyć przerwania jest zawieszony, to obraz danych żywych (rejestry CPU, itp ..), w momencie przerwania, a miarodajne Master wartości rejestrów CPU przywrócić do procesora powinien Be gwint wznowionym . Jeśli użyjesz interfejsu użytkownika debugera do odczytu i / lub zmiany rejestrów procesora (procesu debugowanego), odczyta on i / lub zmieni migawkę / master za pomocą wywołań systemowych.