Udostępnij za pomocą


Debugowanie w trybie źródłowym

Debugowanie aplikacji jest łatwiejsze, jeśli można analizować źródło kodu zamiast zdezasemblowanych plików binarnych.

WinDbg, CDB i KD mogą używać kodu źródłowego podczas debugowania, jeśli język źródłowy to C, C++ lub asembler.

Wymagania dotyczące kompilacji

Aby użyć debugowania źródłowego, należy skonfigurować kompilator lub konsolidator do tworzenia plików .pdb w trakcie budowania plików binarnych. Te pliki symboli pokazują debugerowi, w jaki sposób instrukcje binarne odpowiadają wierszom źródłowym.

Ponadto debuger musi mieć dostęp do rzeczywistych plików źródłowych , ponieważ pliki symboli nie zawierają rzeczywistego tekstu źródłowego.

Jeśli jest to możliwe, kompilator i konsolidator nie powinny optymalizować kodu. Debugowanie źródła i dostęp do zmiennych lokalnych są trudniejsze, a czasami prawie niemożliwe, jeśli kod został zoptymalizowany. Jeśli używasz narzędzia Build jako kompilatora i linkera, ustaw makro MSC_OPTIMIZATION na /Od /Oi, aby uniknąć optymalizacji.

Lokalizowanie plików symboli i plików źródłowych

Aby debugować w trybie źródłowym, debuger musi mieć możliwość znalezienia plików źródłowych i plików symboli. Aby uzyskać więcej informacji, odwiedź ścieżkę źródłową.

Rozpoczynanie debugowania źródłowego

Debuger może wyświetlać informacje o źródle za każdym razem, gdy zawiera odpowiednie symbole i pliki źródłowe dla wątku, który jest obecnie debugowany.

Jeśli uruchomisz nową aplikację w trybie użytkownika przy użyciu debugera, początkowa przerwa wystąpi, gdy Ntdll.dll ładuje aplikację. Ponieważ debuger nie ma dostępu do plików źródłowych Ntdll.dll, w tym momencie nie można uzyskać dostępu do informacji źródłowych aplikacji.

Aby przenieść licznik programu na początek aplikacji, dodaj punkt przerwania w punkcie wejścia do pliku binarnego. W oknie Polecenie debugera wpisz następujące polecenie.

bp main
g

Następnie aplikacja jest ładowana i zatrzymuje się po wprowadzeniu funkcji main . (Oczywiście można użyć dowolnego punktu wejścia, nie tylko głównego).

Jeśli aplikacja zgłasza wyjątek, przechodzi do debugera. Informacje o źródle są dostępne w tym momencie. Jeśli jednak wystąpi przerwanie przy użyciu CTRL+C, CTRL+BREAK lub Debuguj | Break polecenie, debuger tworzy nowy wątek, więc nie widzisz kodu źródłowego.

Po osiągnięciu wątku, dla którego masz pliki źródłowe, możesz użyć okna Polecenia debugera, aby wykonać polecenia debugowania źródłowego. Jeśli używasz usługi WinDbg, zostanie wyświetlone okno Źródło . Jeśli otworzyłeś już okno źródłowe, klikając pozycję Otwórz plik źródłowy w menu Plik, program WinDbg zazwyczaj tworzy nowe okno dla źródła. Poprzednie okno można zamknąć bez wpływu na proces debugowania.

Debugowanie źródłowe w graficznym interfejsie użytkownika WinDbg

Jeśli używasz systemu WinDbg, okno Źródła zostanie wyświetlone, jak tylko licznik programu znajdzie się w kodzie, dla którego debugger ma informacje źródłowe.

WinDbg wyświetla jedno okno źródłowe dla każdego pliku źródłowego, który Ty lub WinDbg otworzyliście. Aby uzyskać więcej informacji o właściwościach tekstu tego okna, zobacz Źródło systemu Windows.

Następnie możesz przejść przez aplikację lub wykonać polecenie do punktu przerwania lub kursora. Aby uzyskać więcej informacji na temat kroków i śledzenia poleceń, zobacz Kontrolowanie obiektu docelowego.

Jeśli jesteś w trybie źródłowym, odpowiednie okno Źródło przechodzi na pierwszy plan podczas przechodzenia przez aplikację. Ponieważ istnieją również procedury systemu Microsoft Windows, które są wywoływane podczas wykonywania aplikacji, debuger może przenieść okno Dezasemblacji na pierwszy plan, gdy wystąpi tego rodzaju wywołanie (ponieważ debuger nie ma dostępu do źródła dla tych funkcji). Gdy licznik programu powróci do znanych plików źródłowych, odpowiednie okno Źródło stanie się aktywne.

Podczas przechodzenia przez aplikację WinDbg wyróżnia lokalizację w oknie Źródło oraz w oknie Dezasemblacji. Linie, w których ustawiono punkty przerwania, są również wyróżnione. Kod źródłowy jest kolorowany zgodnie z analizą języka. Jeśli wybrano okno Źródło, możesz umieścić wskaźnik myszy na symbolu, aby go ocenić. Aby uzyskać więcej informacji na temat tych funkcji i sposobu ich kontrolowania, zobacz Źródło systemu Windows.

Aby aktywować tryb źródłowy w systemie WinDbg, użyj polecenia l+t , kliknij tryb źródłowy w menu debugowania lub kliknij tryb źródłowy na przycisku. Gdy tryb źródłowy jest aktywny, wskaźnik ASM jest niedostępny na pasku stanu.

Możesz wyświetlać lub zmieniać wartości dowolnych zmiennych lokalnych podczas przechodzenia przez funkcję w trybie źródłowym. Aby uzyskać więcej informacji, zobacz Odczytywanie i zapisywanie pamięci.

Debugowanie źródłowe w oknie polecenia debugera

Jeśli używasz usługi CDB, nie masz oddzielnego okna Źródło. Możesz jednak nadal wyświetlać postęp podczas przechodzenia przez źródło.

Przed rozpoczęciem debugowania źródłowego w programie CDB należy załadować symbole linii źródłowych, wydając polecenie .lines (Włącz/wyłącz obsługę linii źródłowych) lub uruchamiając debuger z opcją -lines w wierszu poleceń -lines.

Jeśli wykonasz polecenie l+t , wszystkie kroki programu są wykonywane jeden wiersz źródłowy naraz. Użyj l-t, aby wykonać krok po jednej instrukcji asemblera naraz. Jeśli używasz narzędzia WinDbg, to polecenie ma taki sam efekt, jak wybranie lub wyczyszczenie trybu źródłowego w menu Debugowanie lub użycie przycisków paska narzędzi.

Polecenie l+s wyświetla bieżący wiersz źródłowy i numer wiersza w wierszu polecenia. Jeśli chcesz wyświetlić tylko numer wiersza, użyj l +l zamiast tego.

Jeśli używasz l+o i l+s, podczas przechodzenia przez program wyświetlany jest tylko wiersz źródłowy. Licznik programu, kod dezasemblacji i informacje rejestrowe są ukryte. Ten rodzaj wyświetlania umożliwia szybkie przechodzenie przez kod i oglądanie jedynie jego źródła.

Możesz użyć polecenia lsp (Ustaw liczbę wierszy źródłowych), aby określić dokładnie, ile wierszy źródłowych jest wyświetlanych podczas przechodzenia lub wykonywania aplikacji.

Następująca sekwencja poleceń to skuteczny sposób przechodzenia przez plik źródłowy.

.lines        enable source line information
bp main       set initial breakpoint
l+t           stepping will be done by source line
l+s           source lines will be displayed at prompt
g             run program until "main" is entered
pr            execute one source line, and toggle register display off
p             execute one source line 

Ponieważ ENTER powtarza ostatnie polecenie, możesz teraz przejść przez aplikację przy użyciu ENTER. Każdy krok powoduje wyświetlenie wiersza źródłowego, przesunięcia pamięci i kodu zestawu.

Aby uzyskać więcej informacji na temat interpretowania widoku dezasemblacji, zobacz Debugowanie w trybie asemblera.

Po wyświetleniu kodu zestawu każda dostępna lokalizacja pamięci jest wyświetlana na prawym końcu wiersza. Aby wyświetlić lub zmienić wartości w tych lokalizacjach, możesz użyć poleceń d* (Wyświetl pamięć) i e* (Wprowadź wartości).

Jeśli musisz wyświetlić każdą instrukcję asemblera, aby określić przesunięcia lub informacje o pamięci, użyj l-t do przechodzenia przez instrukcje asemblera zamiast linii źródłowych. Informacje o wierszu źródłowym mogą być nadal wyświetlane. Każdy wiersz źródłowy odpowiada co najmniej jednej instrukcji zestawu.

Wszystkie te polecenia są dostępne w usłudze WinDbg i w usłudze CDB. Możesz użyć poleceń, aby wyświetlić informacje o wierszu źródłowym z okna poleceń debugera WinDbg zamiast z okna źródłowego.

Linie źródłowe i przesunięcia

Możesz również przeprowadzić debugowanie źródła przy użyciu ewaluatora wyrażeń, aby określić przesunięcie odpowiadające określonemu wierszowi źródłowemu.

Następujące polecenie wyświetla przesunięcie pamięci.

? `[[module!]filename][:linenumber]` 

Jeśli pominięto nazwę pliku, debuger wyszukuje plik źródłowy odpowiadający bieżącemu licznikowi programu.

Debugger odczytuje numer linii jako liczbę dziesiętną, chyba że dodasz 0x przed nim, niezależnie od bieżącego domyślnego systemu liczbowego. Jeśli pominiesz numer linii, wyrażenie oceni się na początkowy adres pliku wykonywalnego, który odpowiada plikowi źródłowemu.

Ta składnia jest rozumiana w usłudze CDB tylko wtedy, gdy polecenie .lines lub opcja wiersza polecenia -lines załadowała symbole wiersza polecenia źródłowego.

Ta technika jest bardzo wszechstronna, ponieważ można jej używać niezależnie od tego, gdzie wskazuje licznik programu. Na przykład ta technika umożliwia ustawienie punktów przerwania z wyprzedzeniem przy użyciu poleceń, takich jak poniższe.

bp `source.c:31` 

Aby uzyskać więcej informacji, zobacz Składnia wiersza źródłowego i Używanie punktów przerwania.

Krokowanie i śledzenie w trybie źródłowym

Podczas debugowania w trybie źródłowym może istnieć wiele wywołań funkcji w jednym wierszu źródłowym. Nie można użyć poleceń p i t , aby oddzielić te wywołania funkcji.

Na przykład w poniższym poleceniu, polecenie t wchodzi do zarówno GetTickCount, jak i printf, podczas gdy polecenie p pomija oba wywołania funkcji.

printf( "%x\n", GetTickCount() );

Jeśli chcesz przeskoczyć przez niektóre wywołania podczas śledzenia innych wywołań, użyj .step_filter (Ustaw filtr kroków), aby wskazać, które wywołania należy pominąć.

Za pomocą _step_filter można filtrować funkcje struktury (na przykład klasy Microsoft Foundation (MFC) lub wywołania biblioteki szablonów aktywnych (ATL).