Condividi tramite


Espressioni nel debugger di Visual Studio

Il debugger di Visual Studio include analizzatori di espressioni che funzionano quando si immette un'espressione nella finestra di dialogo QuickWatch, nella finestra Watch o nella finestra Immediato. Gli analizzatori di espressioni funzionano anche nella finestra Punti di interruzione e in molte altre posizioni nel 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 di codice F#, è necessario convertire le espressioni nella sintassi C# prima di immettere le espressioni in una finestra o in una finestra di dialogo del debugger. Quando si convertono espressioni da F# a C#, assicurarsi di ricordare che C# usa l'operatore per verificare l'uguaglianza == , mentre F# usa il singolo =.

Espressioni C++

Per informazioni sull'uso degli operatori di contesto con espressioni in C++, vedere Operatore di contesto (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. Ad esempio, l'espressione seguente 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 . Ad esempio, se myFraction è un'istanza di , che definisce l'operatore CFractiondella funzione di FixedPointconversione , l'espressione seguente genera un errore:

(FixedPoint)myFraction

Non è possibile utilizzare 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, è consigliabile sostituire #define's con enumerazioni e funzioni quando possibile.

uso delle dichiarazioni dello spazio dei nomi

Non è possibile usare dichiarazioni using namespace. Per accedere a un nome di tipo o a una variabile al di fuori dello 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 di controllo:

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

Uso delle funzioni intrinseche del debugger per mantenere lo stato

Le funzioni intrinseche del debugger consentono di chiamare determinate 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 possono anche rendere più conveniente valutare le espressioni. Ad esempio, è molto più semplice scrivere una condizione di breakpoint con strcmp(str, "asd") rispetto a str[0] == 'a' && str[1] == 's' && str[2] == 'd'. )

Area Funzioni intrinseche
Lunghezza stringa 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
Win32 CoDecodeProxy, DecodePointer, GetLastError, TlsGetValue
Windows 8 RoInspectCapturedStackBackTrace, WindowsCompareStringOrdinal, WindowsGetStringLen, WindowsGetStringRawBuffer

Queste funzioni richiedono che il processo di cui è in corso il debug sia in esecuzione in Windows 8. Il debug dei file di dump generati da un dispositivo Windows 8 richiede anche che il computer Visual Studio esegua Windows 8. Tuttavia, se si esegue il debug di un dispositivo Windows 8 in modalità remota, il computer Visual Studio può eseguire Windows 7.
WindowsGetStringLen e WindowsGetStringRawBuffer vengono usati solo dal motore di esecuzione (EE) 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 trovato.

DecodeHString : funzione helper per formattare il valore di un HSTRING. Estrae il valore HSTRING dallo stack e inserisce i byte di una struttura StringInfo che l'EE può usare per indicare dove si trova la stringa. Questo viene usato solo internamente dall'EE; 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, convertito 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 - Operatore[] 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, ma la funzione hash è diversa.

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 ad 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 i puntatori o quelli definiti dall'utente non sono supportati.

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

  • Gli operatori sovraccarichi e le funzioni sovraccariche non sono supportati.

  • L'operazione di boxing e unboxing non è supportata.

  • Sizeof l'operatore non è supportato.

C# - Espressioni non supportate

Oggetti dinamici

È possibile usare variabili nelle espressioni del debugger tipate in modo statico come dinamiche. Quando gli oggetti che implementano IDynamicMetaObjectProvider vengono valutati nella finestra di osservazione, viene aggiunto un nodo Vista 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:

  • Operatori composti +=, -=, %=/=, e*=

  • Molti cast, inclusi i cast numerici e i cast di argomenti di tipo

  • Chiamate di metodo con più di due argomenti

  • Getters di proprietà con più di due argomenti

  • Setter 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

È possibile usare variabili nelle espressioni del debugger tipate in modo statico come dinamiche. Quando gli oggetti che implementano IDynamicMetaObjectProvider vengono valutati nella finestra 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:

  • Operatori composti +=, -=, %=/=, e*=

  • Molte operazioni di cast, incluse operazioni di cast numerico e operazioni di cast di argomenti di tipo

  • Chiamate al metodo con più di due argomenti

  • Getters delle proprietà con più di due argomenti

  • Setter di proprietà con argomenti

  • Assegnazione a un indicizzatore

  • Operatori && booleani e ||

Costanti locali

Le costanti locali non sono supportate.

Importazione di alias

Gli alias di importazione non sono supportati.

Dichiarazioni di variabili

Non è possibile dichiarare nuove variabili esplicite nelle finestre del debugger. Tuttavia, è possibile assegnare nuove variabili implicite all'interno della finestra Immediata . Queste variabili implicite hanno come ambito la sessione di debug e non sono accessibili all'esterno del debugger. Ad esempio, l'istruzione o = 5 crea in modo implicito una nuova variabile o e 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 modulo, ad esempio End Sub o Module.