Sdílet prostřednictvím


Výrazy v programu ladící sady Visual Studio

Ladicí program sady Visual Studio obsahuje vyhodnocovače výrazů, které fungují při zadávání výrazu v dialogovém okně QuickWatch, okně sledování nebo v okně Okamžitého vyhodnocování. Vyhodnocovač výrazů funguje také v okně Zarážky a na mnoha dalších místech v ladicím programu.

Následující části popisují omezení vyhodnocování výrazů pro jazyky podporované sadou Visual Studio.

Výrazy F# nejsou podporovány.

Výrazy jazyka F# se nerozpoznají. Pokud ladíte kód jazyka F#, musíte před zadáním výrazů do okna nebo dialogového okna ladicího programu přeložit výrazy do syntaxe jazyka C#. Při překladu výrazů z jazyka F# do jazyka C# nezapomeňte, že jazyk C# používá == operátor k otestování rovnosti, zatímco jazyk F# používá jediný =.

Výrazy jazyka C++

Informace o použití kontextových operátorů s výrazy v jazyce C++naleznete v tématu Kontextový operátor (C++).

Nepodporované výrazy v jazyce C++

Konstruktory, destruktory a převody

Není možné volat konstruktor nebo destruktor objektu, a to ani explicitně, ani implicitně. Například následující výraz explicitně volá konstruktor a výsledkem je chybová zpráva:

my_date( 2, 3, 1985 )

Nemůžete zavolat funkci převodu, pokud je cílem převodu třída. Takový převod zahrnuje konstrukci objektu. Pokud je například myFraction instance CFraction, která definuje operátor funkce převodu FixedPoint, výsledkem následujícího výrazu je chyba:

(FixedPoint)myFraction

Nové nebo odstraněné operátory nelze volat. Například následující výraz se nepodporuje:

new Date(2,3,1985)

Makra preprocesoru

Makra preprocesoru nejsou v ladicím programu podporována. Pokud je například konstanta VALUE deklarována jako: #define VALUE 3, nemůžete ji použít VALUE v okně Kukátko . Abyste se tomuto omezení vyhnuli, měli byste #define nahradit výčty a funkcemi, kdykoli je to možné.

using namespace declarations

Nemůžete použít deklarace using namespace. Pokud chcete získat přístup k názvu typu nebo proměnné mimo aktuální obor názvů, musíte použít plně kvalifikovaný název.

Anonymní jmenné prostory

Anonymní obory názvů nejsou podporované. Pokud máte následující kód, nemůžete test přidat do okna sledování:

namespace mars
{
    namespace
    {
        int test = 0;
    }
}
int main()
{
    // Adding a watch on test doesn't work.
    mars::test++;
    return 0;
}

Použití intrinsických funkcí ladicího programu k udržování stavu

Vnitřní funkce ladicího programu umožňují volat určité funkce C/C++ ve výrazech beze změny stavu aplikace.

Interní funkce debuggeru:

  • Je zaručeno, že jsou bezpečné: Spuštění vnitřní funkce ladicího programu nepoškodí proces, který se ladí.

  • Jsou povoleny ve všech výrazech, a to i ve scénářích, kde vedlejší efekty a vyhodnocování funkcí nejsou přípustné.

  • Pracujte ve scénářích, kdy běžná volání funkcí nejsou možná, například ladění minidumpu.

    Vnitřní funkce ladicího programu mohou také usnadnit vyhodnocování výrazů. Například strcmp(str, "asd") je mnohem jednodušší psát do podmínky zarážky než str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Area Vnitřní funkce
Délka řetězce strlen, wcslen, strnlen, wcsnlen
Porovnání řetězců strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
Hledání řetězců strchr, wcschr, memchr, wmemchr, strstr, wcsstr
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Tyto funkce vyžadují, aby proces, který je laděn, běžel ve Windows 8. Ladění souborů výpisu paměti vygenerovaných ze zařízení s Windows 8 také vyžaduje, aby počítač s Visual Studio měl nainstalovaný systém Windows 8. Pokud ale ladíte zařízení s Windows 8 vzdáleně, může být na počítači se sadou Visual Studio spuštěný systém Windows 7.
WindowsGetStringLen a WindowsGetStringRawBuffer používají se pouze prováděcím modulem (EE) na úrovni zdroje.
Miscellaneous __log2 – Vrátí logaritmus základu 2 zadaného celého čísla, zaokrouhlené na nejbližší dolní celé číslo.

__findNonNull – Vyhledá pole ukazatelů a vrátí index prvního prvku, který není null.
- Parametry: (1) Ukazatel na první prvek v poli (void*), (2) Velikost pole (bez znaménka).
– Návratové hodnoty: (1) Index prvního nenulového prvku v poli, počínaje 0, nebo -1, pokud nebyl nalezen.

DecodeHString – pomocná funkce pro formátování hodnoty HSTRING. Vytáhne hodnotu HSTRING ze zásobníku a zapíše bajty struktury StringInfo, kterou může EE použít k určení umístění řetězce. Používá se pouze interně eE; není uživateli k dispozici, aby volal přímo.

DecodeWinRTRestrictedException – dekóduje výjimku s omezeným přístupem WinRT, aby získal omezený popis.
- Parametry: (1) znaky řetězce zakončené ‘nulou’ představující omezený referenční řetězec.
- Návratová hodnota: Znaky řetězce ukončeného hodnotou null obsahující skutečnou chybovou zprávu, která se má zobrazit.

DynamicCast – implementuje dynamic_cast.
- Parametry: (1) Ukazatel na objekt, který má být přetypován.
- Datové položky: Objekt CDynamicCastData by měl být přidružen jako datová položka k odpovídající executeIntrinsic() instrukce. Datová položka kóduje typ, ze kterého přetypováváme a na který přetypováváme, stejně jako to, zda vyhodnocujeme výraz natvis (což je nutné pro diagnostiku k přerušení nekonečné rekurze).
- Návratová hodnota: (1) Ukazatel na objekt, přetypovaný na správný typ, nebo NULL, pokud objekt, který se přetypovává, není instancí správného typu.

DynamicMemberLookup – pomocná funkce pro dynamické získání hodnoty člena třídy

GetEnvBlockLength – pomocná funkce pro získání délky bloku prostředí ve znacích Používá se pro $env.

Stdext_HashMap_Int_OperatorBracket_idx – operátor[] pro stdext::hash_map. Předpokládá výchozí hashovací funkci s klíčem int. Vrátí hodnotu. Vnitřní operátor[] podporuje pouze načítání existujících položek z hashtable – nepodporuje vkládání nových položek do tabulky, protože to může zahrnovat nežádoucí složitost, například přidělení paměti. Operátor[] však může být použit k úpravě hodnoty přidružené ke klíči již v tabulce.
- Parametry zásobníku: (1) Adresa objektu stdext::hash_map, (2) Klíč do tabulky (int), (3) Struktura HashMapPdb, která určuje offsety polí členů, které implementace funkce potřebuje k vyhledání. To je povinné, protože přímý přístup ke symbolům není na vzdálené straně dostupný.
- Vrátí hodnoty: (1) Pokud je klíč nalezen v tabulce, vrátí se adresa hodnoty, která odpovídá klíči. V opačném případě hodnota NULL.

Std_UnorderedMap_Int_OperatorBracket_idx – std::unordered_map funguje stejně jako stdext::hash_map, s výjimkou funkce hash se liší.

ConcurrencyArray_OperatorBracket_idx // Concurrency::array<>::operator[index<>] a operator(index<>)

ConcurrencyArray_OperatorBracket_int // Concurrency::array<>::operator(int, int, ...)

ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] a operátor(tiled_index<>)

ConcurrencyArrayView_OperatorBracket_idx // Concurrency::array_view<>::operator[index<>] a operator(index<>)

ConcurrencyArrayView_OperatorBracket_int // Concurrency::array_view<>::operator(int, int, ...)

ConcurrencyArrayView_OperatorBracket_tidx // Concurrency::array_view<>::operator[tiled_index<>] a operator(tiled_index<>)

TreeTraverse_Init – inicializuje nové procházení stromem.
Podporuje vizualizéry založené na rozšířeních, které nejsou určeny k použití v souborech .natvis .

TreeTraverse_Next – Načte uzly z probíhajícího procházení stromu.
Podporuje vizualizéry založené na rozšířeních, které nejsou určeny k použití v souborech .natvis .

TreeTraverse_Skip – přeskočí uzly v probíhající procházení stromu.
Podporuje vizualizéry založené na rozšířeních, které nejsou určeny k použití v souborech .natvis .

C++/CLI – nepodporované výrazy

  • Přetypování zahrnující ukazatele nebo přetypování definovaná uživatelem se nepodporují.

  • Porovnání objektů a přiřazení se nepodporuje.

  • Přetížené operátory a přetížené funkce se nepodporují.

  • Boxování a unboxování nejsou podporovány.

  • Sizeof operátor není podporován.

C# – Nepodporované výrazy

Dynamické objekty

Proměnné můžete použít ve výrazech ladicího programu, které jsou staticky zadané jako dynamické. Když se objekty, které implementují IDynamicMetaObjectProvider , vyhodnotí v okně Kukátko, přidá se uzel dynamického zobrazení. Uzel Dynamické zobrazení zobrazuje členy objektů, ale neumožňuje úpravy hodnot členů.

Nejsou podporovány následující funkce dynamických objektů:

  • Složené operátory +=, , -=%=, /=a*=

  • Mnoho přetypování, včetně číselných přetypování a přetypování argumentů typu

  • Volání metody s více než dvěma argumenty

  • Getters s více než dvěma argumenty

  • Setters vlastností s argumenty

  • Přiřazení indexeru

  • Logické operátory && a ||

Anonymní metody

Vytváření nových anonymních metod se nepodporuje.

Visual Basic – nepodporované výrazy

Dynamické objekty

Proměnné můžete použít ve výrazech ladicího programu, které jsou staticky zadané jako dynamické. Když se objekty, které implementují IDynamicMetaObjectProvider, vyhodnotí v okně Kukátko, přidá se uzel s názvem "Dynamic View". Uzel Dynamické zobrazení zobrazuje členy objektů, ale neumožňuje úpravy hodnot členů.

Nejsou podporovány následující funkce dynamických objektů:

  • Složené operátory +=, , -=%=, /=a*=

  • Mnoho přetypování, včetně číselných přetypování a přetypování argumentů typu

  • Volání metody s více než dvěma argumenty

  • Getters s více než dvěma argumenty

  • Nastavovače vlastností s argumenty

  • Přiřazení k indexeru

  • Logické operátory && a ||

Místní konstanty

Místní konstanty se nepodporují.

Import aliasů

Aliasy importu nejsou podporovány.

Deklarace proměnných

V oknech ladicího programu nemůžete deklarovat explicitní nové proměnné. Nové implicitní proměnné ale můžete přiřadit v okně Okamžité . Tyto implicitní proměnné jsou omezeny na ladicí relaci a nejsou dostupné mimo ladicí nástroj. Například příkaz o = 5 implicitně vytvoří novou proměnnou o a přiřadí jí hodnotu 5. Takové implicitní proměnné jsou typu Object , pokud typ nelze odvodit ladicím programem.

Nepodporovaná klíčová slova

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • Klíčová slova na úrovni názvového prostoru nebo modulu, například End Sub nebo Module.