Espressioni nel debugger di Visual Studio

Il debugger di Visual Studio include analizzatori di espressioni che vengono usati quando si immette un'espressione nella finestra di dialogo Controllo immediato , nella finestra Espressioni di controllo o Immediato . Gli analizzatori di espressioni vengono inoltre usati nella finestra Punti di interruzione e in molte altre posizioni all'interno del debugger.

Le sezioni seguenti descrivono le limitazioni della valutazione delle espressioni per i linguaggi supportati da Visual Studio.

Le espressioni F# non sono supportate

Le espressioni F# non vengono riconosciute. Se si esegue il debug del codice F#, è necessario tradurre le espressioni nella sintassi C# prima di immetterle in una finestra o finestra di dialogo del debugger. Quando si traducono espressioni da F# a C#, tenere presente che C# usa l'operatore == per verificare l'uguaglianza, mentre F# usa il segno =singolo.

Espressioni C++

Per informazioni sull'uso degli operatori di contesto con le espressioni in C++, vedere Context Operator (C++).

Espressioni non supportate in C#

Costruttori, distruttori e conversioni

Non è possibile chiamare un costruttore o un distruttore per un oggetto, in modo esplicito o implicito. La seguente espressione, ad esempio, chiama in modo esplicito un costruttore e genera un messaggio di errore:

my_date( 2, 3, 1985 )

Non è possibile chiamare una funzione di conversione se la destinazione della conversione è una classe . Tale conversione comporta la costruzione di un oggetto. Se, ad esempio, myFraction è un'istanza di CFractionche definisce l'operatore della funzione di conversione FixedPoint, la seguente espressione genera un errore:

(FixedPoint)myFraction

Non è possibile chiamare gli operatori new o delete. Ad esempio, l'espressione seguente non è supportata:

new Date(2,3,1985)

Macro del preprocessore

Le macro del preprocessore non sono supportate nel debugger. Ad esempio, se una costante VALUE viene dichiarata come : #define VALUE 3, non è possibile usare VALUE nella finestra Espressione di controllo . Per evitare questa limitazione, sostituire #definecon enumerazioni e funzioni quando possibile.

uso delle dichiarazioni dello spazio dei nomi

Non è possibile usare using namespace le dichiarazioni. Per accedere a una variabile o a un nome di tipo all'esterno di spazio dei nomi corrente, è necessario usare il nome completo.

Spazi dei nomi anonimi

Gli spazi dei nomi anonimi non sono supportati. Se si dispone del codice seguente, non è possibile aggiungere test alla finestra espressioni di controllo:

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

Uso di funzioni intrinseche del debugger per mantenere lo stato

Le funzioni intrinseche del debugger consentono di chiamare alcune funzioni C/C++ nelle espressioni senza modificare lo stato dell'applicazione.

Funzioni intrinseche del debugger:

  • È garantito che sia sicuro: l'esecuzione di una funzione intrinseca del debugger non danneggia il processo di cui viene eseguito il debug.

  • Sono consentite in tutte le espressioni , anche negli scenari in cui gli effetti collaterali e la valutazione della funzione non sono consentiti.

  • Lavorare in scenari in cui le normali chiamate di funzione non sono possibili, ad esempio il debug di un minidump.

    Le funzioni intrinseche del debugger rendono più pratica la valutazione delle espressioni. Ad esempio, è molto più facile scrivere strncmp(str, "asd") in una condizione del punto di interruzione piuttosto che str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Area Funzioni intrinseche
Lunghezza delle stringhe strlen, wcslen, strnlen, wcsnlen
Confronto tra stringhe strcmp, wcscmp, stricmp, wcsicmp, _stricmp, _strcmpi, _wcsicmp, _wcscmpi, strncmp, wcsncmp, strnicmp, wcsnicmp, _strnicmp, _wcsnicmp
Ricerca di stringhe strchr, wcschr, memchr, wmemchr, strstr, wcsstr
App Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Queste funzioni richiedono che il processo sottoposto a debug sia eseguito in Windows 8. Il debug dei file dump generati da un dispositivo Windows 8 richiede inoltre che nel computer Visual Studio sia eseguito Windows 8. Tuttavia, se si esegue il debug di un dispositivo Windows 8 in modalità remota, nel computer Visual Studio può essere eseguito Windows 7.
WindowsGetStringLene WindowsGetStringRawBuffer vengono usati solo dal motore di esecuzione (edizione Enterprise) a livello di origine.
Varie __log2: restituisce la base di log 2 di un intero specificato, arrotondata all'intero inferiore più vicino.

__findNonNull: esegue la ricerca in una matrice di puntatori, restituendo l'indice del primo elemento non Null.
- Parametri: (1) Puntatore al primo elemento nella matrice (void*), (2) Dimensioni della matrice (senza segno int).
- Valori restituiti: (1) indice in base 0 del primo elemento non Null nella matrice o -1 se non viene trovato.

DecodeHString : funzione helper per formattare il valore di un HSTRING. Rimuove il valore HSTRING dallo stack, inserisce i byte di una struttura StringInfo che l'edizione Enterprise può usare per indicare dove si trova la stringa. Questa operazione viene usata solo internamente dal edizione Enterprise; non è disponibile per l'utente per chiamare direttamente.

DecodeWinRTRestrictedException : decodifica un'eccezione con restrizioni WinRT per ottenere la descrizione con restrizioni.
- Parametri: (1) caratteri di una stringa con terminazione Null che rappresenta la stringa di riferimento con restrizioni.
- Valore restituito: caratteri di una stringa con terminazione Null contenente il messaggio di errore effettivo da visualizzare.

DynamicCast : implementa dynamic_cast.
- Parametri: (1) Puntatore all'oggetto da eseguire.
- Elementi di dati: un oggetto CDynamicCastData deve essere associato come elemento di dati all'istruzione ExecuteIntrinsic() corrispondente. L'elemento di dati codifica il tipo da cui si esegue il cast, nonché se si sta valutando o meno un'espressione natvis (necessaria per la diagnostica per interrompere la ricorsione infinita).
- Valore restituito: (1) Puntatore all'oggetto, cast al tipo corretto o NULL se l'oggetto sottoposto a cast non è un'istanza del tipo corretto.

DynamicMemberLookup : funzione helper per ottenere il valore di un membro della classe in modo dinamico

GetEnvBlockLength : funzione helper per ottenere la lunghezza di un blocco di ambiente, in caratteri. Utilizzato per $env.

Stdext_HashMap_Int_OperatorBracket_idx - Operator[] per stdext::hash_map. Presuppone la funzione hash predefinita con una chiave "int". Restituisce il valore . L'operatore intrinseco[] supporta solo il recupero di elementi esistenti dalla tabella hash. Non supporta l'inserimento di nuovi elementi nella tabella, in quanto ciò potrebbe comportare complessità indesiderate, ad esempio l'allocazione della memoria. Tuttavia, operator[] può essere usato per modificare il valore associato a una chiave già presente nella tabella.
- Parametri dello stack: (1) Indirizzo dell'oggetto stdext::hash_map, (2) Chiave nella tabella (int), (3) struttura HashMapPdb che specifica gli offset di campo dei membri necessari all'implementazione della funzione per eseguire la ricerca. Questa operazione è necessaria perché l'accesso diretto ai simboli non è disponibile sul lato remoto.
- Valori restituiti: (1) Se la chiave si trova nella tabella, l'indirizzo del valore che corrisponde alla chiave. In caso contrario, NULL.

Std_UnorderedMap_Int_OperatorBracket_idx - std::unordered_map funziona allo stesso modo di stdext::hash_map, ad eccezione della funzione hash.

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

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

ConcurrencyArray_OperatorBracket_tidx // Concurrency::array<>::operator[tiled_index<>] e operator(tiled_index<>)

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

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

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

TreeTraverse_Init : inizializza un nuovo attraversamento dell'albero.
Supporta i visualizzatori basati su estensione, non destinati all'uso nei file natvis .

TreeTraverse_Next: recupera i nodi da un attraversamento dell'albero in sospeso.
Supporta i visualizzatori basati su estensione, non destinati all'uso nei file natvis .

TreeTraverse_Skip: ignora i nodi in un attraversamento dell'albero in sospeso.
Supporta i visualizzatori basati su estensione, non destinati all'uso nei file natvis .

C++/CLI - Espressioni non supportate

  • I cast che coinvolgono puntatori o cast definiti dall'utente non sono supportati.

  • Il confronto e l'assegnazione degli oggetti non sono supportati.

  • Gli operatori di overload e le funzioni di overload non sono supportati.

  • La conversione boxing e unboxing non sono supportate.

  • Sizeof l'operatore non è supportato.

C# - Espressioni non supportate

Oggetti dinamici

Nelle espressioni del debugger è possibile usare variabili tipizzate staticamente come dinamiche. Quando gli oggetti implementati IDynamicMetaObjectProvider vengono valutati nella finestra Espressione di controllo, viene aggiunto un nodo Visualizzazione dinamica. Il nodo Visualizzazione dinamica mostra i membri dell'oggetto, ma non consente di modificare i valori dei membri.

Le funzionalità seguenti degli oggetti dinamici non sono supportate:

  • Gli operatori composti +=, -=, %=, /=e *=

  • Molti cast, inclusi cast numerici e cast dell'argomento di tipo

  • Chiamate al metodo con più di due argomenti

  • Metodi Get di proprietà con più di due argomenti

  • Metodi set di proprietà con argomenti

  • Assegnazione a un indicizzatore

  • Operatori booleani && e ||

Metodi anonimi

La creazione di nuovi metodi anonimi non è supportata.

Visual Basic - Espressioni non supportate

Oggetti dinamici

Nelle espressioni del debugger è possibile usare variabili tipizzate staticamente come dinamiche. Quando gli oggetti che implementano IDynamicMetaObjectProvider vengono valutati nella finestra Espressioni di controllo, viene aggiunto un nodo Visualizzazione dinamica. Il nodo Visualizzazione dinamica mostra i membri dell'oggetto, ma non consente di modificare i valori dei membri.

Le funzionalità seguenti degli oggetti dinamici non sono supportate:

  • Gli operatori composti +=, -=, %=, /=e *=

  • Molti cast, inclusi cast numerici e cast dell'argomento di tipo

  • Chiamate al metodo con più di due argomenti

  • Metodi Get di proprietà con più di due argomenti

  • Metodi set di proprietà con argomenti

  • Assegnazione a un indicizzatore

  • Operatori booleani && e ||

Costanti locali

Le costanti locali non sono supportate.

Alias di importazione

Gli alias di importazione non sono supportati.

Dichiarazione di variabili

Non è possibile dichiarare nuove variabili esplicite nelle finestre del debugger. È invece possibile assegnare un valore a una variabile implicita nella finestra Controllo immediato . Queste variabili implicite hanno come ambito la sessione di debug e non sono accessibili all'esterno del debugger. L'istruzione o = 5 , ad esempio, crea in modo implicito una nuova variabile o alla quale assegna il valore 5. Tali variabili implicite sono di tipo Object , a meno che il tipo non possa essere dedotto dal debugger.

Parole chiave non supportate

  • AddressOf

  • End

  • Error

  • Exit

  • Goto

  • On Error

  • Resume

  • Return

  • Select/Case

  • Stop

  • SyncLock

  • Throw

  • Try/Catch/Finally

  • With

  • Parole chiave a livello di spazio dei nomi o di modulo, ad esempio End Sub o Module.