Debuger — Debugger

Samo debugowanie Winpdb

Debugger lub debugowanie narzędzie to program komputerowy używany do testów i debugowania innych programów (program „docelowy”). Głównym zastosowaniem debuggera jest uruchomienie programu docelowego w kontrolowanych warunkach, które pozwalają programiście śledzić jego operacje w toku i monitorować zmiany w zasobach komputera (najczęściej obszary pamięci używane przez program docelowy lub system operacyjny komputera), które mogą wskazywać wadliwy kod. Typowe funkcje debugowania obejmują możliwość uruchamiania lub zatrzymywania programu docelowego w określonych punktach, wyświetlanie zawartości pamięci, rejestrów procesora lub urządzeń pamięci masowej (takich jak napędy dysków) oraz modyfikowanie zawartości pamięci lub rejestru w celu wprowadzenia wybranych danych testowych, które mogą być przyczyną wadliwego wykonania programu.

Badany kod może alternatywnie działać na symulatorze zestawu instrukcji (ISS), technice, która zapewnia dużą moc w jego zdolności do zatrzymania się, gdy napotkane zostaną określone warunki, ale która zazwyczaj będzie nieco wolniejsza niż wykonywanie kodu bezpośrednio na odpowiednim (lub ten sam) procesor. Niektóre debugery oferują dwa tryby działania, pełną lub częściową symulację, aby ograniczyć ten wpływ.

Pułapka ” występuje, gdy program nie może normalnie kontynuować pracy z powodu błędu programowania lub nieprawidłowych danych. Na przykład program mógł próbować użyć instrukcji niedostępnej w bieżącej wersji procesora lub próbować uzyskać dostęp do niedostępnej lub chronionej pamięci . Gdy program „pułapki” lub osiągnie ustalony stan, debuger zazwyczaj pokazuje lokalizację w oryginalnym kodzie, jeśli jest to debugger na poziomie źródłowym lub debuger symboliczny , powszechnie spotykany obecnie w zintegrowanych środowiskach programistycznych . Jeśli jest to debugger niskiego poziomu lub debuger języka maszynowego , pokazuje wiersz w dezasemblacji (chyba że ma również dostęp online do oryginalnego kodu źródłowego i może wyświetlić odpowiednią sekcję kodu z zestawu lub kompilacji).

Cechy

Zazwyczaj debugery oferują procesor zapytań, mechanizm rozpoznawania symboli, interpreter wyrażeń i interfejs obsługi debugowania na najwyższym poziomie. Debugery oferują również bardziej zaawansowane funkcje, takie jak uruchamianie programu krok po kroku ( single-stepping lub animacja programu ), zatrzymywanie ( przerywanie ) (wstrzymywanie programu w celu sprawdzenia aktualnego stanu) przy pewnym zdarzeniu lub określonej instrukcji za pomocą punktu przerwania oraz śledzenie wartości zmiennych. Niektóre debugery mają możliwość modyfikowania stanu programu podczas jego działania. Możliwe jest również kontynuowanie wykonywania w innej lokalizacji w programie, aby ominąć awarię lub błąd logiczny.

Ta sama funkcjonalność, która sprawia, że ​​debugger jest przydatny do korygowania błędów, pozwala na używanie go jako narzędzia do łamania oprogramowania w celu obejścia ochrony przed kopiowaniem , zarządzania prawami cyfrowymi i innych funkcji ochrony oprogramowania. Często czyni go również użytecznym jako ogólne narzędzie weryfikacyjne, pokrycie błędów i analizator wydajności , zwłaszcza jeśli pokazywane są długości ścieżek instrukcji . Wczesne mikrokomputery z pamięcią masową na dyskach często korzystały z możliwości diagnozowania i odzyskiwania uszkodzonych rekordów danych katalogowych lub rejestru, „przywracania” plików oznaczonych jako usunięte lub łamania ochrony hasłem do plików.

Większość popularnych silników debugowania, takich jak gdb i dbx , udostępnia interfejsy wiersza poleceń oparte na konsoli . Interfejsy debugera to popularne rozszerzenia silników debugera, które zapewniają integrację ze środowiskiem IDE , animację programów i funkcje wizualizacji.

Nagrywaj i odtwarzaj debugowanie

Debugowanie nagrywania i odtwarzania , znane również jako „programowe nagrywanie lotu” lub „nagrywanie wykonania programu”, przechwytuje zmiany stanu aplikacji i przechowuje je na dysku podczas wykonywania każdej instrukcji w programie. Nagranie może być następnie odtwarzane w kółko i interaktywnie debugowane w celu diagnozowania i usuwania usterek. Debugowanie w trybie nagrywania i odtwarzania jest bardzo przydatne w przypadku zdalnego debugowania oraz rozwiązywania sporadycznych, niedeterministycznych i innych trudnych do odtworzenia defektów.

Odwrotne debugowanie

Niektóre debugery zawierają funkcję zwaną „ debugowaniem wstecznym ”, znaną również jako „debugowanie historyczne” lub „debugowanie wsteczne”. Debugery te umożliwiają cofnięcie w czasie wykonywania programu. Różne debugery zawierają tę funkcję. Microsoft Visual Studio (edycja 2010 Ultimate, 2012 Ultimate, 2013 Ultimate i 2015 Enterprise) oferuje debugowanie wsteczne IntelliTrace dla C#, Visual Basic .NET i niektórych innych języków, ale nie C++. Debugery wsteczne istnieją również dla języków C, C++, Java, Python, Perl i innych. Niektóre są open source; niektóre są zastrzeżonym oprogramowaniem komercyjnym. Niektóre debugery wsteczne spowalniają cel o rzędy wielkości, ale najlepsze debugery wsteczne spowalniają 2x lub mniej. Debugowanie wsteczne jest bardzo przydatne w przypadku niektórych typów problemów, ale nadal nie jest powszechnie stosowane.

Zależność językowa

Niektóre debugery działają w jednym określonym języku, podczas gdy inne mogą w sposób przezroczysty obsługiwać wiele języków. Na przykład, jeśli główny program docelowy jest napisany w języku COBOL, ale wywołuje podprogramy języka asemblera i podprogramy PL/1 , debugger może być zmuszony do dynamicznego przełączania trybów, aby dostosować się do zmian w języku w miarę ich pojawiania się.

Ochrona pamięci

Niektóre debugery zawierają również ochronę pamięci, aby uniknąć naruszeń pamięci, takich jak przepełnienie bufora . Może to być niezwykle ważne w środowiskach przetwarzania transakcji, w których pamięć jest dynamicznie przydzielana z „pul” pamięci na podstawie zadania po zadaniu.

Wsparcie sprzętowe do debugowania

Większość nowoczesnych mikroprocesorów ma co najmniej jedną z tych funkcji w konstrukcji procesora, aby ułatwić debugowanie:

  • Obsługa sprzętowa programu do wykonywania pojedynczych kroków, taka jak flaga pułapki .
  • Zestaw instrukcji, który spełnia wymagania wirtualizacji Popka i Goldberga , ułatwia pisanie oprogramowania debuggera, które działa na tym samym procesorze, co debugowane oprogramowanie; taki procesor może wykonywać wewnętrzne pętle testowanego programu z pełną prędkością i nadal pozostawać pod kontrolą debugera.
  • Programowanie w systemie umożliwia zewnętrznemu debugerowi sprzętowemu przeprogramowanie testowanego systemu (na przykład dodanie lub usunięcie punktów przerwania instrukcji). Wiele systemów z taką obsługą ISP ma również inne wsparcie debugowania sprzętu.
  • Wsparcie sprzętowe dla punktów przerwania kodu i danych , takich jak komparatory adresów i komparatory wartości danych lub, przy znacznie większym nakładzie pracy, sprzęt do obsługi błędów stronicowania .
  • Dostęp JTAG do sprzętowych interfejsów debugowania, takich jak te w procesorach architektury ARM lub przy użyciu zestawu poleceń Nexusa . Procesory używane w systemach wbudowanych zazwyczaj mają rozbudowaną obsługę debugowania JTAG.
  • Mikrokontrolery z zaledwie sześcioma pinami muszą używać zamienników JTAG o małej liczbie pinów, takich jak BDM , Spy-Bi-Wire lub debugWIRE w Atmel AVR . DebugWIRE, na przykład, wykorzystuje sygnalizację dwukierunkową na pinie RESET.

Interfejsy debugera

Niektóre z najbardziej wydajnych i popularnych debugerów implementują tylko prosty interfejs wiersza poleceń (CLI) — często w celu maksymalizacji przenośności i zminimalizowania zużycia zasobów. Deweloperzy zazwyczaj uważają, że debugowanie za pomocą graficznego interfejsu użytkownika (GUI) jest łatwiejsze i bardziej wydajne. To jest powód wizualnych front-endów, które pozwalają użytkownikom monitorować i kontrolować podrzędne debuggery tylko z CLI za pomocą graficznego interfejsu użytkownika . Niektóre interfejsy debugera GUI są zaprojektowane tak, aby były kompatybilne z różnymi debugerami tylko z interfejsem CLI, podczas gdy inne są ukierunkowane na jeden konkretny debuger.

Lista debuggerów

Niektóre powszechnie używane debugery to:

Wcześniejsze debugery minikomputerów obejmują:

Wcześniejsze debugery Mainframe obejmują (w dniu wydania zamówienia):

  • 1974 TEST/DEBUGOWANIE OLIVER CICS
  • 1980 TEST/DEBUGOWANIE PARTII SIMONA
  • 1985 CA/EZTEST
  • 1990 XPEDITER i Expediter CICS

Obecne debugery mainframe:

Zobacz też

Bibliografia

  • Sanjeev Kumar Aggarwal; M. Saratha Kumara (2003). „Debuggery dla języków programowania”. W YN Srikant; Priti Shankar (red.). Podręcznik projektowania kompilatorów: optymalizacje i generowanie kodu maszynowego . Boca Raton, Floryda: CRC Press . s. 295-327. Numer ISBN 978-0-8493-1240-3.
  • Jonathan B. Rosenberg (1996). Jak działają debugery: algorytmy, struktury danych i architektura . John Wiley i Synowie . Numer ISBN 0-471-14966-7.

Cytaty

Zewnętrzne linki