Sdílet prostřednictvím


Výrazy v ladicím programu 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ě kukátka nebo v okně Okamžité . Vyhodnocovače výrazů jsou také v práci v okně Zarážky a mnoho dalších míst 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

Konstruktor nebo destruktor pro objekt nelze volat explicitně nebo implicitně. Například následující výraz explicitně volá konstruktor a výsledkem je chybová zpráva:

my_date( 2, 3, 1985 )

Funkci převodu nelze volat, 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 FixedPointfunkce převodu , 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 #definebyste nahradit výčty a funkcemi, kdykoli je to možné.

using namespace declarations

Deklarace nemůžete použít 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í obory názvů

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

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

Použití vnitřní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.

Vnitřní funkce ladicího programu:

  • 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 , i ve scénářích, kde nejsou povolené vedlejší účinky a vyhodnocení funkce.

  • 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 strncmp(str, "asd") je mnohem jednodušší psát do zarážky než str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Plocha 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 byl proces, který je laděný, spuštěný ve Windows 8. Ladění souborů výpisu paměti vygenerovaných ze zařízení s Windows 8 také vyžaduje, aby byl počítač sady Visual Studio se systémem 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.
Různé __log2 – vrátí základ protokolu 2 zadaného celého čísla zaokrouhleného 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) 0 index prvního elementu, který není null v matici nebo -1, pokud nebyl nalezen.

DecodeHString – pomocná funkce pro formátování hodnoty HSTRING. Vypíše hodnotu HSTRING ze zásobníku, nasdílí bajty struktury StringInfo, kterou může EE použít k tomu, aby bylo možné zjistit, kde je řetězec umístěn. 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) znaků řetězce s ukončenou hodnotou null 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 k 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ém přetypujeme, a také to, jestli vyhodnocujeme výraz natvis (potřebný k přerušení nekonečné rekurze diagnostiky).
- Návratová hodnota: (1) Ukazatel na objekt, přetypování na správný typ nebo NULL, pokud objekt, který se přetypuje, 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) HashMapPdb struktury, která určuje posuny 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íč v tabulce, 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 operator(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<>] and operator(tiled_index<>)

TreeTraverse_Init – Inicializuje novou procházení stromu.
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 čekají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 čekají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í.

  • Boxing a unboxing 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 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 ||

Místní konstanty

Místní konstanty se nepodporují.

Import aliasů

Aliasy importu se nepodporují.

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 vymezeny na ladicí relaci a nejsou přístupné mimo ladicí program. 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 oboru názvů nebo modulu, například End Sub nebo Module.