Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Grupa symboli zawiera zestaw symboli do wydajnego manipulowania grupą. Grupę symboli można utworzyć i wypełnić ręcznie lub automatycznie wygenerować i zaktualizować na podstawie symboli w zakresach leksykalnych, takich jak zmienne lokalne i argumenty funkcji. Interfejs IDebugSymbolGroup służy do reprezentowania grupy symboli.
Istnieją dwa sposoby tworzenia grupy symboli. Pusta grupa symboli jest zwracana przez polecenie CreateSymbolGroup, a grupa symboli bieżącego zakresu leksyktycznego jest zwracana przez polecenie GetScopeSymbolGroup.
Uwaga Grupa symboli wygenerowana z bieżącego zakresu to migawka zmiennych lokalnych. Jeśli w obiekcie docelowym wystąpi jakiekolwiek wykonanie, symbole mogą nie być już dokładne. Ponadto jeśli bieżący zakres ulegnie zmianie, grupa symboli nie będzie już reprezentować bieżącego zakresu (ponieważ będzie nadal reprezentować zakres, dla którego został utworzony).
Symbole można dodać do grupy symboli przy użyciu polecenia AddSymbol i usunąć za pomocą polecenia RemoveSymbolByIndex lub RemoveSymbolByName. Metoda OutputAsType nakazuje debugerowi użycie innego typu symbolu podczas obsługi danych symbolu.
Uwaga Wartości dla symboli o określonym zakresie mogą nie być dokładne. W szczególności architektura maszyny i optymalizacje kompilatora mogą uniemożliwić debugerowi dokładne określenie wartości symbolu.
Informacje o wpisie symbolu to opis symbolu, w tym jego lokalizacja i jego typ. Aby znaleźć te informacje dotyczące symbolu w module, użyj elementu IDebugSymbols3::GetSymbolEntryInformation. Aby znaleźć te informacje dotyczące symbolu w grupie symboli, użyj elementu IDebugSymbolGroup2::GetSymbolEntryInformation. Aby uzyskać szczegółowe informacje o wpisie symbolu, zobacz DEBUG_SYMBOL_ENTRY .
Następujące metody zwracają informacje o symbolu w grupie symboli:
Polecenie GetSymbolName zwraca nazwę symbolu.
Polecenie GetSymbolOffset zwraca adres bezwzględny w wirtualnej przestrzeni adresowej obiektu docelowego symbolu, jeśli symbol ma adres bezwzględny.
Polecenie GetSymbolRegister zwraca rejestr zawierający symbol, jeśli symbol znajduje się w rejestrze.
Polecenie GetSymbolSize zwraca rozmiar danych dla symbolu.
Polecenie GetSymbolTypeName zwraca nazwę typu symbolu.
Polecenie GetSymbolValueText zwraca wartość symbolu jako ciąg.
Jeśli symbol jest przechowywany w rejestrze lub w lokalizacji pamięci znanej aparatowi debugera, jego wartość można zmienić przy użyciu polecenia WriteSymbol.
Symbol jest symbolem nadrzędnym , jeśli zawiera inne symbole. Na przykład struktura zawiera swoje elementy. Symbol jest symbolem podrzędnym , jeśli znajduje się w innym symbolu. Symbol może być symbolem nadrzędnym i podrzędnym. Każda grupa symboli ma płaską strukturę i zawiera symbole nadrzędne i ich elementy podrzędne. Każdy symbol ma głębokość — symbole bez elementów nadrzędnych w grupie symboli mają głębokość zera, a głębokość każdego symbolu podrzędnego jest większa niż głębokość jej elementu nadrzędnego. Elementy podrzędne symbolu nadrzędnego mogą lub nie mogą być obecne w grupie symboli. Gdy dzieci znajdują się w grupie symboli, symbol nadrzędny jest określany jako rozwinięty. Aby dodać lub usunąć elementy podrzędne symbolu w grupie symboli, użyj polecenia ExpandSymbol.
Liczba symboli w grupie symboli jest zwracana przez polecenie GetNumberSymbols. Indeks symbolu w grupie symboli jest numerem identyfikacyjnym; indeks waha się od zera do liczby symboli minus jeden. Za każdym razem, gdy symbol jest dodawany lub usuwany z grupy symboli — na przykład przez rozwinięcie symbolu — indeks wszystkich symboli w grupie symboli może ulec zmianie.
Parametry symboli, w tym informacje o relacjach nadrzędno-podrzędnych, można znaleźć przy użyciu GetSymbolParameters. Ta metoda zwraca strukturę DEBUG_SYMBOL_PARAMETERS .
Symbole w grupie symboli można wydrukować do strumienia wyjściowego debugera przy użyciu metody OutputSymbols.
Zakresy
Bieżący zakres lub bieżący kontekst lokalny określa zmienne lokalne uwidocznione przez aparat debugera. Zakres ma trzy składniki:
Ramka stosu.
Bieżąca instrukcja.
Kontekst rejestrowy.
Jeśli ramka stosu wywołań znajduje się na szczycie stosu wywołań, bieżąca instrukcja jest tą, która doprowadziła do ostatniego zdarzenia. W przeciwnym razie bieżąca instrukcja to wywołanie funkcji, które spowodowało następną wyższą ramkę stosu.
Metody GetScope i SetScope mogą służyć do pobierania i ustawiania bieżącego zakresu. Gdy wystąpi zdarzenie, bieżący zakres jest ustawiony na zakres zdarzenia. Bieżący zakres można zresetować do zakresu ostatniego zdarzenia przy użyciu funkcji ResetScope.
Kontekst wątku
Kontekst wątku jest stanem zachowanym przez system Windows podczas przełączania wątków. Jest to podobne do kontekstu rejestru, z tą różnicą, że istnieje pewien stan procesora dostępny wyłącznie dla jądra, który jest częścią kontekstu rejestru, ale nie należy do kontekstu wątku. Ten dodatkowy zasób jest dostępny w formie rejestrów podczas debugowania w trybie jądra.
Kontekst wątku jest reprezentowany przez strukturę CONTEXT zdefiniowaną w pliku ntddk.h. Ta struktura jest zależna od platformy, a jej interpretacja zależy od efektywnego typu procesora. Metody GetThreadContext i SetThreadContext mogą służyć do pobierania i ustawiania kontekstu wątku.