Wyrażenia w macierzystym C++
Debuger akceptuje wyrażenia większości firmy Microsoft i ANSI C/C++.Zapewnia także debugera Funkcje i operatorów kontekst aby ocenę wyrażeń, bezpieczniejsze i wygodniejsze.W tym temacie opisano na wyrażeniach języka C++, które należy zwrócić uwagę na następujące ograniczenia:
Nie można użyć operatora kontekstu lub większości specyfikatory formatu w kodzie lub przy użyciu skryptu lub zarządzany kod wyrażeń.Są one specyficzne dla modułu szacującego macierzystym C++.
W tej sekcji
Przy użyciu funkcji intrinisic debugera, aby utrzymać stan
Za pomocą operatorów kontekstu, aby określić symbol
Ograniczenia dotyczące wyrażeń macierzystym C++
Kontrola dostępu
Niejednoznacznych odwołań
Anonimowe przestrzenie nazw
Konstruktory i destruktory, a konwersje
Dziedziczenie
Funkcje Wplatany i kompilatora
Stałe numeryczne
Operator funkcji
Przeciążenie
Pierwszeństwo
Formatów symboli
Typ rzutowania
Przy użyciu funkcji intrinisic debugera, aby utrzymać stan
Funkcje debugera daje sposobem na połączenie niektórych funkcji C/C++ w wyrażeniach, bez zmiany stanu aplikacji.
Funkcje debugera:
Gwarancja bezpiecznych: wykonywanie wewnętrzna funkcja debuger nie zniszczy proces, który jest debugowany.
Są dozwolone w wszystkie wyrażenia, nawet w scenariuszach, w którym skutki uboczne i wartości funkcji nie są dozwolone.
Praca w scenariuszach, w którym wywołań funkcji regularnych nie są możliwe, na przykład przy debugowaniu mini-zrzut.
Funkcje debugera można także wprowadzić ocenę wyrażenia wygodniejsze.Na przykład strncmp(str, “asd”) jest znacznie ułatwia pisanie w stanie przerwania niż str[0] == ‘a’ && str[1] == ‘s’ && str[2] == ‘d’.)
Obszar |
Funkcje |
---|---|
Długość ciągu |
strlen, wcslen, strnlen, wcsnlen |
Porównania ciągów |
strcmp, wcscmp, stricmp, _stricmp, _strcmpi, wcsicmp, _wcscmpi, _wcsnicmp, strncmp, wcsncmp, strnicmp, wcsnicmp |
Wyszukiwanie ciągu |
strchr, wcschr, strstr, wcsstr |
Win32 |
GetLastError(), TlsGetValue() |
Windows 8 |
WindowsGetStringLen(), WindowsGetStringRawBuffer() Funkcje te wymagają proces, który jest debugowany uruchomiony przez Windows 8.Debugowanie pliki zrzutu, wygenerowana przez urządzenie Windows 8 również wymaga, aby komputer Visual Studio działa Windows 8.Jednakże jeśli zdalnie debugowania urządzenia Windows 8 komputerze Visual Studio może być uruchomiony system Windows 7. |
Różne |
__log2 Zwraca dziennika o podstawie 2 określona liczba całkowita, zaokrąglona do najbliższej liczby całkowitej w dolnym. |
Za pomocą operatorów kontekstu, aby określić symbol
Operator kontekstu jest operator dodatkowe dostarczane przez macierzysty debugera.Podczas debugowania kodu macierzystego, można użyć operatora kontekstu Aby zakwalifikować się do lokalizacji punkt przerwania, nazwa zmiennej lub wyrażenia.Operator kontekstu jest przydatna do celów, takich jak określanie nazwę z zewnętrznym zakresie, w przeciwnym razie ukryte na skutek nazwę lokalną.
Składnia
{,,module} wyrażenie
Moduł jest nazwą modułu.Pełna ścieżka można użyć, aby odróżnić między modułami o tej samej nazwie.
wyrażenie jest dowolnym prawidłowym wyrażeniem C++, która jest rozpoznawana jako prawidłowe miejsce docelowe nazwę funkcji, nazwy zmiennej lub adres wskaźnika w moduł.
Nawiasy klamrowe muszą zawierać dwa przecinki, a moduł (pliku wykonywalnego lub DLL) nazwa lub Pełna ścieżka.
Na przykład, aby ustawić punkt przerwania na SomeFunction funkcji EXAMPLE.dll:
{,,EXAMPLE.dll}SomeFunction
Jeśli moduł ścieżka zawiera przecinek, nazwie spację lub nawias, należy użyć ścieżki w cudzysłowie, analizator składni kontekstu prawidłowo rozpoznać ciąg.Pojedyncze cudzysłowy są traktowane jako część nazwę pliku systemu Windows, trzeba używać podwójny cudzysłów.Na przykład:
{,"a long, long, library name.dll", } g_Var
Gdy szacującego napotka symbol w wyrażeniu, wyszukuje symbol w następującej kolejności:
Zakres leksykalny na zewnątrz, począwszy od bieżącego bloku, szereg instrukcje zawarte w nawiasach i kolejno na zewnątrz otaczającym bloku.Bieżącego bloku jest kod zawierający bieżącą lokalizację, adres wskaźnik instrukcji.
Zakres funkcji.Bieżącą funkcję.
Zakres klasy, jeśli bieżąca lokalizacja znajduje się wewnątrz funkcji składowej języka C++.Zakres klasy zawiera wszystkie klasy podstawowej.Tester wyrażenie stosowane są reguły normalnej pozycji dominującej.
Globalne symbole w bieżącego modułu.
Publiczne symbole w bieżącym programie.
Za pomocą operatora kontekstu Określ początkową moduł wyszukiwania i pominąć bieżącą lokalizację.
Ograniczenia dotyczące wyrażeń macierzystym C++
Po wprowadzeniu wyrażenia C/C++ w oknie Debuger obowiązują te ogólne ograniczenia:
Kontrola dostępu
Debuger można uzyskać dostęp do wszystkich członków klasy niezależnie od tego, kontroli dostępu.Można sprawdzić każdy członek obiektu klasy, w tym podstawowych klas i obiektów osadzonych.
Niejednoznacznych odwołań
Jeśli wyrażenie debuger odwołuje się do nazwa członka niejednoznaczne, należy użyć nazwy klasy, aby zakwalifikować go.Na przykład jeśli CObject jest wystąpieniem CClass, która dziedziczy funkcji element członkowski o nazwie expense z obu AClass i BClass, CObject.expense jest niejednoznaczna.Można usunąć niejasności w następujący sposób:
CObject.BClass::expense
Aby rozwiązać niejasności, Tester wyrażenie stosuje reguły normalnej pozycji dominującej dotyczących nazwy składników.
Anonimowe przestrzenie nazw
Macierzystym C++ szacującego nie obsługuje anonimowe obszarów nazw.Załóżmy, na przykład, poniższy kod:
#include "stdafx.h"
namespace mars
{
namespace
{
int test = 0;
}
}
int main()
{
// Adding a watch on test does not work.
mars::test++;
return 0;
}
Jedynym sposobem, aby obejrzeć symbol test w tym przykładzie jest skorzystanie z dekoracyjną nazwę:
(int*)?test@?A0xccd06570@mars@@3HA
Konstruktory i destruktory, a konwersje
Nie można wywołać konstruktora i destruktora w przypadku obiektu jawnie lub niejawnie za pomocą wyrażenia, który wzywa do budowy tymczasowy obiekt.Na przykład następujące wyrażenie jawnie wywołuje konstruktor i powoduje wyświetlenie komunikatu o błędzie:
Date( 2, 3, 1985 )
Nie można wywołać funkcji konwersji, jeżeli miejsce przeznaczenia konwersji jest klasą.Takie przekształcenie polega na budowie obiektu.Na przykład jeśli myFraction jest wystąpieniem CFraction, która definiuje operator funkcji konwersji FixedPoint, następujące wyrażenie powoduje wystąpienie błędu:
(FixedPoint)myFraction
Jednakże można wywołać funkcję konwersji, jeśli obiekt docelowy konwersji jest typem wbudowanym.Jeśli CFraction definiuje funkcję konwersji operator float, następujące wyrażenie jest dozwolony w debugerze:
(float)myFraction
Może wywoływać funkcje, które zwracają obiekt lub zadeklarować obiektów lokalnych.
Nie można wywołać funkcji new lub delete podmiotów gospodarczych.Następujące wyrażenie nie działa w debugerze:
new Date(2,3,1985)
Dziedziczenie
Debuger umożliwia wyświetlanie klasy obiekt, który posiada wirtualnych klas bazowych, Członkowie wirtualnego klasy podstawowej są wyświetlane dla każdej ścieżki dziedziczenia, nawet jeśli tylko jedno wystąpienie tych członków jest przechowywany.
Wywołań funkcji wirtualnych są poprawnie obsługiwane przez tester wyrażenie.Załóżmy na przykład, klasa CEmployee definiuje funkcję wirtualną computePay, który jest ponownie zdefiniować w klasie, która dziedziczy z CEmployee.Można wywołać computePay za pomocą wskaźnika do CEmployee i posiada funkcję właściwego wykonywane:
empPtr->computePay()
Wskaźnik do obiektu tej klasy mogą być rzutowane na wskaźnik do obiektu klasy podstawowej.Wskaźnik do obiektu klasy podstawowej mogą rzutowane na wskaźnik do obiektu tej klasy, z wyjątkiem przypadków gdy dziedziczenie jest wirtualna.
Funkcje Wplatany i kompilatora
Wyrażenie debuger nie można wywołać kompilator, funkcje lub inlined działa, jeśli funkcja pojawi się co najmniej raz w normalnej funkcji.
Stałe numeryczne
Stałe będące liczbami całkowitymi można użyć wyrażenia debugera w formacie ósemkową, szesnastkową lub dziesiętną.Domyślnie Debuger oczekuje decimal stałych.To ustawienie można zmienić na Ogólne strona Debugging kartę.
Prefiks lub sufiks symbole służy do wyświetlania liczb w innej bazie.W poniższej tabeli przedstawiono formularze, których można użyć.
Składnia |
Przykład (liczbę dziesiętną 100) |
Podstawy |
---|---|---|
cyfry |
100 lub 64 |
Dziesiętną lub szesnastkową, w zależności od bieżącego ustawienia. |
0cyfry |
0144 |
Ósemkowej (podstawa 8) |
0ncyfry |
0n100 |
Dziesiętny (podstawa 10) |
0xcyfry |
0x64 |
Szesnastkowy (podstawa 16) |
cyfryh |
64 h |
Szesnastkowy (podstawa 16) |
Operator funkcji
Wyrażenie debuger mogą wywoływać funkcje operatora dla klasy, jawnie lub niejawnie.Załóżmy na przykład, myFraction i yourFraction są instancjami klasy, która definiuje operator+.Można wyświetlić sumę tych dwóch obiektów za pomocą następującego wyrażenia:
myFraction + yourFraction
Jeśli funkcję operatora jest zdefiniowana jako znajomego, można wywołać ją domyślnie przy użyciu tej samej składni, jak w przypadku funkcji składowej, lub można go wywołać, jawnie w następujący:
operator+( myFraction, yourFraction )
Jak zwykłych funkcji funkcji operatora nie można wywołać z argumentami, które wymagają konwersji z udziałem konstrukcji obiektów.
Debuger nie obsługuje przeciążonych operatorów z wersji const i nie const.Przeciążonych operatorów z wersji const i nie const są często stosowane w bibliotekę STL.
Przeciążenie
Wyrażenie debuger może wywoływać funkcje przeciążony, jeśli istnieje dokładne dopasowanie, lub jeśli mecz wymaga konwersji z udziałem konstrukcji obiektów.Na przykład jeśli calc funkcja ma CFraction obiekt jako parametr i CFraction klasa definiuje Konstruktor pojedynczy argument, który przyjmuje liczbą całkowitą, następujące wyrażenie powoduje błąd:
calc( 23 )
Mimo, że istnieje prawne konwersji do konwersji wartości całkowitej w CFraction obiekt, który calc oczekuje, takie przeliczenie zakłada stworzenie obiektu i nie jest obsługiwana.
Pierwszeństwo
W wyrażeniach debuger C++ zakres operator (::) ma niższy priorytet niż ma to miejsce w kodzie źródłowym.W kodzie źródłowym C++ tego operatora, ma najwyższy priorytet.W debugerze, pierwszeństwo przed przypada między base i przyrostkowe operatory (->, ++, --) i operatory jednoargumentowe (!, &, *i inne).
Formatów symboli
Wprowadź wyrażenie debugera, które zawiera symbole w tej samej formie, używane w kodzie źródłowym, pod warunkiem, że symbole są w module skompilowane z uwzględnieniem informacji debugowania pełnego (/Zi lub /ZI).Jeśli wprowadzisz wyrażenie, które zawiera symbole publiczne, którego symbole znajdują się w bibliotekach lub w modułach skompilowane z /Zd, należy kliknąć nazwę dekoracyjną symbolu, formularz używany w kodzie obiekt.Aby uzyskać więcej informacji, zobacz /Z7, /Zd, /Zi, /ZI (Format informacji debugowania).
Znajduje się lista wszystkich nazw można uzyskać z dekoracyjną i bez informacji systemu NT formularzy przy użyciu opcji/LINK map.Aby uzyskać więcej informacji, zobacz /map (Generuj argument Mapfile).
Przekręcenie nazwy jest mechanizm używany w celu wymuszenia powiązania typu palety.Oznacza to, że tylko nazwy i odwołania z dokładnie pasujące sprawdzanie pisowni, sprawy, konwencja wywołania i typ są połączone ze sobą.
Nazwy zadeklarowana z C konwencji wywoływania, pośrednio lub bezpośrednio za pomocą _cdecl słowa kluczowego, rozpoczyna się od znaku podkreślenia ( _ ).Na przykład funkcja main mogą być wyświetlane jako _main.Nazwy zadeklarowany jako _fastcall zaczynają się od @ symbol.
Dla języka C++ nazwę dekoracyjną koduje typ symbolu oprócz konwencję wywołania.Ten formularz o tej nazwie może być długa i trudne do odczytania.Nazwa zaczyna się od co najmniej jeden znak zapytania (?).Do funkcji języka C++ dekoracji zawiera zakres funkcji, rodzaje parametry funkcji i zwracany typ funkcji.
Typ rzutowania
Jeśli Rzutowanie na typ, typ musi być znana do debugera.Musisz mieć inny obiekt tego typu w programie.Typy utworzone za pomocą typedef instrukcje nie są obsługiwane.