2013-06-07 6 views
8

Podstawowe pytanie & Jestem bardzo nowy w C/C++ i GDB.jak GDB wie, że musi się złamać w określonym punkcie przerwania?

Używamy GDB do debugowania procesu. Załączamy GDB do procesu, a następnie określamy plik filename.c wraz z numerem linii, aby umieścić punkt przerwania.

Moje pytanie brzmi: "W jaki sposób GDB lub system operacyjny, czy może cokolwiek innego wie, że musi złamać się na określonym numerze linii (w nazwie pliku.c) po podłączeniu GDB do uruchomionego procesu?"

Co się dzieje z obrazem, że, powiedzmy, bieżący proces jest uruchamiany w trybie debugowania i stosowany jest punkt przerwania, a proces musi się zepsuć (czekać na dane użytkownika) w tym momencie?

+0

Spójrz na [ptrace (2)] (http://linux.die.net/man/2/ptrace) – nouney

+1

@nouney: To byłaby dobra podstawa dla wspaniałej odpowiedzi. –

Odpowiedz

6

Nie mogę skomentować najnowszej wersji gdb - ale wiele debuggerów faktycznie zamienia instrukcję złożenia na żądaną lokalizację punktu przerwania (w pamięci) za pomocą instrukcji przerwania. To "budzi" debugger, który przejmuje kontrolę w tym momencie.

Zastosowanie zamienionej instrukcji przerwania oznacza, że ​​CPU może wykonać twój program z pełną prędkością i "uruchomić się" w żądanym miejscu.

Nowoczesne procesory są jednak bardzo złożone i prawdopodobnie mają znacznie lepsze funkcje debugowania.

-2

Jeśli użyto opcji -g w gcc/g ++, numery linii każdego pliku źródłowego są dołączane do instrukcji w wynikowych plikach obiektów.

9

W ten sam sposób, jeśli program zatrzymuje się lub zawiesza w danym punkcie, debugger może powiedzieć, gdzie w programie jest ten punkt.

Dla obu z nich do pracy binarny program musi zawierać dodatkowe informacje debugowania, który wiąże adresy w obrazie programu z lokalizacji w kodzie źródłowym (plik źródłowy i numer linii).

Aby dodać punkt przerwania na dany linia debugger znajduje adres programu najbliższy tej linii, modyfikuje kopię pliku wykonywalnego w pamięci, aby wstawić specjalną instrukcję "break" w tym miejscu, co spowoduje przerwanie wykonywania programu, a następnie "śledzi" wykonanie programu i czeka aby dotarł do punktu przerwania i zatrzymał się.

Aby uzyskać więcej informacji zobacz http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ i http://www.howzatt.demon.co.uk/articles/SimplePTrace.html

+3

Na wielu architekturach (np. X86) rejestry debugowania umożliwiają ustawienie (kilku) punktów przerwania bez modyfikowania tekstu programu. –

+0

Nie wiedziałem tego, dziękuję (i dziękuję za edycję). –

1

GDB jest świadomy swojego kodu: on wie o wszystkim. Po ustawieniu punktu przerwania w linii GDB otrzymuje adres instrukcji maszyny równoważnej: cały kod (jako instrukcje maszyny) jest ładowany do pamięci, więc instrukcje kodu mają adres.

Teraz GDB zna adres instrukcji, którą chcesz przerwać. Kiedy uruchomisz swój program, GDB użyje ptrace, co pozwoli GDB "zobaczyć" każdą instrukcję przed jej wykonaniem. Następnie GDB musi tylko sprawdzić, czy bieżąca instrukcja (która zostanie wykonana) jest taka sama jak twoja instrukcja (którą chcesz złamać).

+0

Opisana metoda jest możliwa, ale tak powolna (1000x lub więcej), aby w praktyce była bezużyteczna. To nie działa w rzeczywistości użyteczne debuggery *. –

+0

Zgadzam się ... byłoby zbyt wolno – Gana

Powiązane problemy