Share via


Ambiti e gruppi di simboli

Un gruppo di simboli contiene un set di simboli per una manipolazione efficiente come gruppo. Un gruppo di simboli può essere creato e popolato manualmente o può essere generato e aggiornato automaticamente in base ai simboli negli ambiti lessicali, ad esempio variabili locali e argomenti di funzione. L'interfaccia IDebugSymbolGroup viene usata per rappresentare un gruppo di simboli.

Esistono due modi per creare un gruppo di simboli. Un gruppo di simboli vuoto viene restituito da CreateSymbolGroup e il gruppo di simboli per l'ambito lessicale corrente viene restituito da GetScopeSymbolGroup.

Nota Il gruppo di simboli generato dall'ambito corrente è uno snapshot delle variabili locali. Se si verifica un'esecuzione nella destinazione, i simboli potrebbero non essere più accurati. Inoltre, se l'ambito corrente viene modificato, il gruppo di simboli non rappresenterà più l'ambito corrente , perché continuerà a rappresentare l'ambito per il quale è stato creato.

I simboli possono essere aggiunti a un gruppo di simboli usando AddSymbol e rimossi usando RemoveSymbolByIndex o RemoveSymbolByName. Il metodo OutputAsType indica al debugger di usare un tipo di simbolo diverso durante la gestione dei dati di un simbolo.

Nota I valori per i simboli con ambito potrebbero non essere accurati. In particolare, l'architettura del computer e le ottimizzazioni del compilatore possono impedire al debugger di determinare con precisione il valore di un simbolo.

Le informazioni sulla voce del simbolo sono una descrizione di un simbolo, inclusa la relativa posizione e il relativo tipo. Per trovare queste informazioni per un simbolo in un modulo, usare IDebugSymbols3::GetSymbolEntryInformation. Per trovare queste informazioni per un simbolo in un gruppo di simboli, usare IDebugSymbolGroup2::GetSymbolEntryInformation. Per informazioni dettagliate sulla voce dei simboli , vedere DEBUG_SYMBOL_ENTRY .

I metodi seguenti restituiscono informazioni su un simbolo in un gruppo di simboli:

  • GetSymbolName restituisce il nome del simbolo.

  • GetSymbolOffset restituisce l'indirizzo assoluto nello spazio indirizzi virtuale della destinazione del simbolo, se il simbolo ha un indirizzo assoluto.

  • GetSymbolRegister restituisce il registro contenente il simbolo, se il simbolo è contenuto in un registro.

  • GetSymbolSize restituisce le dimensioni dei dati per il simbolo.

  • GetSymbolTypeName restituisce il nome del tipo del simbolo.

  • GetSymbolValueText restituisce il valore del simbolo come stringa.

Se un simbolo viene archiviato in un registro o in una posizione di memoria nota al motore del debugger, il relativo valore può essere modificato usando WriteSymbol.

Un simbolo è un simbolo padre se contiene altri simboli. Ad esempio, una struttura contiene i relativi membri. Un simbolo è un simbolo figlio se è contenuto in un altro simbolo. Un simbolo può essere sia un simbolo padre che un simbolo figlio. Ogni gruppo di simboli ha una struttura piatta e contiene simboli padre e i relativi elementi figlio. Ogni simbolo ha una profondità : i simboli senza elementi padre nel gruppo di simboli hanno una profondità pari a zero e la profondità di ogni simbolo figlio è maggiore della profondità del padre. Gli elementi figlio di un simbolo padre possono essere presenti o meno nel gruppo di simboli. Quando gli elementi figlio sono presenti nel gruppo di simboli, il simbolo padre viene definito espanso. Per aggiungere o rimuovere gli elementi figlio di un simbolo in un gruppo di simboli, usare ExpandSymbol.

Il numero di simboli in un gruppo di simboli viene restituito da GetNumberSymbols. L'indice di un simbolo in un gruppo di simboli è un numero di identificazione; l'indice è compreso tra zero e il numero di simboli meno uno. Ogni volta che un simbolo viene aggiunto o rimosso da un gruppo di simboli, ad esempio espandendo un simbolo, l'indice di tutti i simboli nel gruppo di simboli può cambiare.

I parametri dei simboli, incluse le informazioni sulle relazioni padre-figlio, sono disponibili usando GetSymbolParameters. Questo metodo restituisce una struttura DEBUG_SYMBOL_PARAMETERS .

I simboli in un gruppo di simboli possono essere stampati nel flusso di output del debugger usando il metodo OutputSymbols.

Ambiti

L'ambito corrente o il contesto locale corrente determina le variabili locali esposte dal motore del debugger. L'ambito ha tre componenti:

  1. Stack frame.

  2. Istruzione corrente.

  3. Contesto del registro.

Se lo stack frame si trova all'inizio dello stack di chiamate, l'istruzione corrente è l'istruzione che ha generato l'ultimo evento. In caso contrario, l'istruzione corrente è la chiamata di funzione che ha generato il successivo stack frame superiore.

I metodi GetScope e SetScope possono essere usati per ottenere e impostare l'ambito corrente. Quando si verifica un evento, l'ambito corrente viene impostato sull'ambito dell'evento. L'ambito corrente può essere reimpostato sull'ambito dell'ultimo evento usando ResetScope.

Contesto del thread

Il contesto del thread è lo stato mantenuto da Windows durante il cambio di thread. Questo comportamento è simile al contesto del registro, ad eccezione del fatto che è presente uno stato del processore solo kernel che fa parte del contesto del registro, ma non il contesto del thread. Questo stato aggiuntivo è disponibile come registri durante il debug in modalità kernel.

Il contesto del thread è rappresentato dalla struttura CONTEXT definita in ntddk.h. Questa struttura dipende dalla piattaforma e la sua interpretazione dipende dal tipo di processore effettivo. I metodi GetThreadContext e SetThreadContext possono essere usati per ottenere e impostare il contesto del thread.