Udostępnij przez


Unikanie wyszukiwania debugera dla symboli, które nie są potrzebne

Ostatnia aktualizacja:

  • 27 maja 2007 r.

Zostanie wyświetlony interesujący punkt przerwania podczas debugowania sterownika, tylko w przypadku wstrzymania debugera przez bardzo długi czas podczas próby załadowania symboli dla sterowników, których nie jesteś właścicielem i które nawet nie mają znaczenia dla zadania debugowania. Co się dzieje?

Domyślnie symbole są ładowane przez debuger zgodnie z potrzebami. (Jest to nazywane odroczonym ładowaniem symboli lub ładowaniem leniwych symboli). Debuger wyszukuje symbole za każdym razem, gdy wykonuje polecenie, które wywołuje wyświetlanie symboli. Może się to zdarzyć w punkcie przerwania, jeśli ustawisz zmienną obserwowaną, która nie jest prawidłowa w bieżącym kontekście, na przykład parametr funkcji lub zmienną lokalną, które nie istnieją w aktualnej ramce stosu. Stają się one nieprawidłowe, gdy kontekst ulega zmianie. Może się to również zdarzyć, jeśli po prostu błędnie wpiszesz nazwę symbolu lub wykonasz nieprawidłowe polecenie debugera— debuger zacznie szukać pasującego symbolu.

Dlaczego czasami trwa to tak długo? Zależy to od tego, czy nazwa symbolu jest kwalifikowana, czy niekwalifikowana. Nazwa kwalifikowanego symbolu jest poprzedzona nazwą modułu, który zawiera symbol, na przykład myModule!myVar. Niekwalifikowana nazwa symbolu nie określa na przykład nazwy modułu myOtherVar.

W przypadku nazwy kwalifikowanej debuger szuka symbolu w określonym module i, jeśli moduł nie został jeszcze załadowany, ładuje moduł (zakładając, że moduł istnieje i zawiera symbol). Dzieje się to dość szybko.

W przypadku niekwalifikowanej nazwy debuger nie "wie", który moduł zawiera symbol, więc musi przeszukać wszystkie z nich. Debuger najpierw sprawdza wszystkie załadowane moduły w celu znalezienia symbolu, a następnie, jeśli nie może dopasować symbolu w żadnym załadowanym module, kontynuuje wyszukiwanie, ładując wszystkie odładowane moduły, począwszy od pamięci podrzędnej i kończąc na serwerze symboli, jeśli używasz. Oczywiście może to zająć dużo czasu.

Jak zapobiec automatycznemu ładowaniu niekwalifikowanych symboli

Opcja SYMOPT_NO_UNQUALIFIED_LOADS wyłącza lub włącza automatyczne ładowanie modułów debugera podczas wyszukiwania niekwalifikowanego symbolu. Gdy SYMOPT_NO_UNQUALIFIED_LOADS jest ustawiona, a debuger próbuje dopasować niekwalifikowany symbol, wyszukuje tylko moduły, które zostały już załadowane, i zatrzymuje wyszukiwanie, gdy nie może pasować do symbolu, zamiast ładowania zwolnionych modułów w celu kontynuowania wyszukiwania. Ta opcja nie ma wpływu na wyszukiwanie kwalifikowanych nazw.

SYMOPT_NO_UNQUALIFIED_LOADS jest domyślnie wyłączona. Aby aktywować tę opcję, użyj opcji -snul wiersza polecenia lub, gdy debuger jest uruchomiony, użyj opcji .symopt+0x100 lub .symopt-0x100 , aby włączyć lub wyłączyć opcję odpowiednio.

Aby zobaczyć efekt działania SYMOPT_NO_UNQUALIFIED_LOADS, spróbuj przeprowadzić ten eksperyment:

  1. Aktywuj hałaśliwe ładowanie symboli (SYMOPT_DEBUG) przy użyciu opcji -n wiersza polecenia lub, jeśli debuger jest już uruchomiony, użyj polecenia .symopt+0x80000000 lub komendy rozszerzenia debuggera !sym noisy. SYMOPT_DEBUG instruuje debugera, aby wyświetlał informacje o wyszukiwaniu symboli, takich jak nazwa każdego modułu, gdy jest ładowany, lub komunikat o błędzie, jeśli debuger nie może znaleźć pliku.
  2. Poinstruuj debugera, aby oszacował nieistniejąca symbol (na przykład wpisz ?asdasdasd). Debugger powinien zgłaszać liczne błędy w trakcie wyszukiwania nieistniejącego symbolu.
  3. Aktywuj SYMOPT_NO_UNQUALIFIED_LOADS przy użyciu pliku symopt+0x100.
  4. Powtórz krok 2. Debuger powinien wyszukiwać tylko załadowane moduły dla nieistniejących symboli i powinno zakończyć zadanie znacznie szybciej.
  5. Aby wyłączyć SYMOPT_DEBUG, użyj polecenia .symopt-0x80000000 lub rozszerzenia debugera !sym quiet .

Dostępnych jest wiele opcji do kontrolowania sposobu ładowania debugera i korzystania z symboli. Aby uzyskać pełną listę opcji symboli i sposób ich używania, zobacz "Ustawianie opcji symboli" w dokumentacji online dostarczonej z narzędziami debugowania dla systemu Windows. Najnowsza wersja pakietu Narzędzi debugowania dla systemu Windows jest dostępna jako bezpłatne pobranie z sieci, lub można zainstalować pakiet z zestawu DDK systemu Windows, zestawu Platform SDK, lub dysku CD diagnostyki obsługi klienta.

Co należy zrobić?

  • Aby przyspieszyć wyszukiwanie symboli, użyj kwalifikowanych nazw w punktach przerwania i poleceniach debugera, jeśli to możliwe. Jeśli chcesz wyświetlić symbol ze znanego modułu, zakwalifikuj go przy użyciu nazwy modułu; Jeśli nie wiesz, gdzie znajduje się symbol, użyj niekwalifikowanej nazwy. W przypadku zmiennych lokalnych i argumentów funkcji użyj $ jako nazwy modułu (na przykład $! MyVar).
  • Aby zdiagnozować przyczyny powolnego ładowania symboli, aktywuj hałaśliwe ładowanie symboli (SYMOPT_DEBUG) przy użyciu opcji -n wiersza polecenia lub, jeśli debuger jest już uruchomiony, za pomocą polecenia .symopt+0x80000000 lub !sym hałaśliwe rozszerzenie debugera.
  • Aby uniemożliwić debugerowi wyszukiwanie symboli w modułach, które nie zostały załadowane, aktywuj SYMOPT_NO_UNQUALIFIED_LOADS przy użyciu opcji -snul wiersza polecenia lub, jeśli debuger jest już uruchomiony, używając .symopt+0x100.
  • Aby jawnie załadować moduły potrzebne do sesji debugowania, użyj poleceń debugera, takich jak .reload lub ld.

Zobacz też

Pobieranie zestawu WDK

narzędzia debugowania dla systemu Windows

wprowadzenie do debugowania systemu Windows