Jak działają punkty przerwania w kodzie C++?

Jak działają punkty przerwania w kodzie C++? Czy są to specjalne instrukcje wstawiane pomiędzy niektóre instrukcje asemblera podczas kompilacji kodu? A może jest coś jeszcze na miejscu? Ponadto, w jaki sposób realizowane są kroki przez kod? Tak samo jak punkty przerwania...?

Author: gablin, 2010-10-12

4 answers

To zależy od procesora i debuggera.

Na przykład jedno z możliwych rozwiązań na procesorze x86:

  • Wstaw jednobajtową instrukcję INT3 w wymaganym miejscu
  • Poczekaj, aż pojawi się wyjątek punktu przerwania
  • Porównaj adresy WYJĄTKÓW z listą punktów przerwania, aby określić, który z nich
  • wykonuj akcje typu breakpoint
  • Zastąp INT3 oryginalnym bajtem i przełącz debugowany proces w tryb śledzenia (wykonywanie procesora krok po kroku instrukcje)
  • kontynuuj proces debugowania
  • natychmiast łapiesz wyjątek trace - instrukcja została wykonana
  • Put INT3 back

Watchpoints można zaimplementować w podobny sposób, ale zamiast INT3 umieszcza się Stronę memory, w której obserwowana zmienna jest tylko do odczytu lub w trybie no access i czeka na wyjątek segmentacji.

Przejście przez montaż można również wykonać za pomocą trybu śledzenia. Przechodzenie przez linie źródłowe może być również wykonane przez umieszczanie punktów przerwania na kolejnych instrukcjach, w oparciu o dane debugowania.

Również niektóre procesory mają wsparcie dla hardware breakpoint, gdy tylko załadujesz adres do jakiegoś rejestru.

 37
Author: Xeor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 14:20:40

Zgodnie z ten wpis na blogu na technochakra.com masz rację:

Punkty przerwania oprogramowania działają poprzez wstawienie specjalnej instrukcji do debugowanego programu. Ta specjalna instrukcja na platformie Intel to "int 3". Po wykonaniu wywołuje funkcję obsługi wyjątków debuggera.

Nie jestem pewien, w jaki sposób implementowana jest kolejna Instrukcja. Jednak artykuł dodaje:

Ze względów praktycznych jest nierozsądne jest proszenie o rekompilację za każdym razem, gdy punkt przerwania jest dodawany lub usuwany. Debugery zmieniają załadowany obraz pliku wykonywalnego w pamięci i wstawiają instrukcję" int 3 " w czasie wykonywania.

Jest to jednak używane tylko dla opcji "Uruchom do bieżącej linii".

 8
Author: ChrisF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 14:11:20

Pojedynczy krok jest zaimplementowany na poziomie kodu (asemblera), a nie na poziomie C++. Debugger wie, jak mapować linie kodu C++ na adresy kodu.

Istnieją różne implementacje. Istnieją Procesory obsługujące debugowanie z rejestrami punktów przerwania. Gdy wykonanie osiągnie adres w rejestrze punktów przerwania, procesor wykonuje wyjątek punktu przerwania.

Innym podejściem jest łatanie kodu na czas wykonania specjalną instrukcją, co najwyżej jednobajtową Instrukcja. W systemach x86, które zwykle int 3.

Pierwsze podejście zezwala na punkty przerwania w pamięci ROM, drugie pozwala na więcej punktów przerwania w tym samym czasie.

 4
Author: harper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 14:07:08

AFAIK wszystkie debuggery (dla dowolnego skompilowanego języka), które pozwalają na nieograniczoną liczbę punktów przerwania, używają wariantu zastąpienia instrukcji wskazaniem pułapki specjalną wartością (jak opisano powyżej) i przechowywania listy miejsc, w których te wartości zostały umieszczone.

Gdy procesor próbuje wykonać jedną z tych specjalnych wartości, wywoływany jest wyjątek, debugger wychwytuje go i sprawdza, czy adres wyjątku znajduje się na jego liście punktów przerwania. Jeśli tak, debugger jest wywoływany, a użytkownik ma możliwość interakcji. Jeśli tak nie jest, to wyjątek jest spowodowany czymś, co było w programie od samego początku, a debugger pozwala na 'przekazanie' wyjątku do dowolnego programu obsługi błędów.

Zauważ również, że debugowanie samoodtwarzającego się kodu może się nie udać właśnie dlatego, że debugger chwilowo modyfikuje sam kod. (Oczywiście, nikt nigdy nie napisze samodoskonalenia, prawda? >;-)

Z tych powodów ważne jest, aby debugger ma możliwość usunięcia wszystkich ustawionych punktów przerwania przed zakończeniem sesji debugowania.

 1
Author: smirkingman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 14:31:55