Controllo dei flag e dei parametri dei punti di interruzione

Esistono diversi metodi che possono essere usati per determinare le informazioni di base sui punti di interruzione:

  • GetId restituisce l'ID punto di interruzione.

  • GetType restituisce il tipo di punto di interruzione (software o processore) e il tipo del processore effettivo in cui è impostato il punto di interruzione.

  • GetAdder restituisce il client che ha aggiunto il punto di interruzione.

  • GetOffset restituisce l'indirizzo di un punto di interruzione.

  • GetOffsetExpression restituisce la stringa di espressione che specifica la posizione del punto di interruzione.

Oltre alla posizione e al tipo di punto di interruzione, un punto di interruzione ha diversi parametri che controllano il comportamento.

I parametri dei punti di interruzione possono essere controllati tramite un'ampia gamma di metodi specifici. Inoltre, la maggior parte dei parametri può essere eseguita una query con GetParameters.

Flag punti di interruzione

I flag dei punti di interruzione sono un tipo di parametri di punto di interruzione.

I flag dei punti di interruzione possono essere sottoposti a query usando GetFlags. Possono essere modificati usando AddFlags, RemoveFlags o SetFlags.

I flag dei punti di interruzione formano un campo bit. I flag possibili che possono essere usati in questo campo bit e i relativi significati sono i seguenti:

DEBUG_BREAKPOINT_ENABLED
Quando questo flag è impostato, il punto di interruzione è abilitato e avrà il suo effetto normale. Quando questo flag non è impostato, il punto di interruzione è disabilitato e non avrà alcun effetto. Se si desidera disattivare temporaneamente un punto di interruzione, è possibile rimuovere questo flag; è quindi facile aggiungere questo flag quando si vuole riabilitare questo punto di interruzione.

DEBUG_BREAKPOINT_ADDER_ONLY
Quando questo flag è impostato, il punto di interruzione è un punto di interruzione privato. Questo punto di interruzione è visibile solo al client che l'ha aggiunto. In questo caso, altri client non potranno eseguire query sul motore per il punto di interruzione e il motore non invierà eventi generati dal punto di interruzione ad altri client. Tutti i callback (evento e output) correlati a questo punto di interruzione verranno inviati solo a questo client. Vedere GetAdder.

DEBUG_BREAKPOINT_GO_ONLY
Quando questo flag è impostato, il punto di interruzione verrà attivato solo se la destinazione è in esecuzione senza restrizioni. Non verrà attivato se il motore esegue le istruzioni nella destinazione.

DEBUG_BREAKPOINT_ONE_SHOT
Quando questo flag viene impostato, il punto di interruzione verrà rimosso automaticamente la prima volta che viene attivato.

DEBUG_BREAKPOINT_DEFERRED
Quando questo flag viene impostato, il punto di interruzione viene posticipato. Questo flag viene impostato dal motore quando viene specificato l'offset del punto di interruzione usando un'espressione simbolica e il motore non può valutare l'espressione. Ogni volta che un modulo viene caricato o interrotto nella destinazione, il motore tenterà di rivalutare l'espressione per tutti i punti di interruzione la cui posizione viene specificata usando un'espressione. Quelli che non possono essere valutati vengono contrassegnati come posticipati. Questo flag non può essere modificato da qualsiasi client.

Altri parametri del punto di interruzione

I parametri del punto di interruzione includono anche:

Conteggio dei passaggi
Se il punto di interruzione ha un numero di passaggi associato a esso, non verrà attivato finché la destinazione non ha superato il punto di interruzione il numero di volte specificato. Il numero di pass impostato originariamente è disponibile usando GetPassCount. Numero di volte rimanenti che il motore passerà il punto di interruzione prima che venga attivato possa essere trovato usando GetCurrentPassCount. Il conteggio dei passaggi può essere reimpostato su un nuovo valore usando SetPassCount.

Thread di corrispondenza
Se il punto di interruzione ha un thread associato a esso, verrà ignorato dal motore quando viene rilevato da qualsiasi altro thread. Il thread può essere trovato usando GetMatchThreadId e può essere modificato usando SetMatchThreadId.

Comando
Il punto di interruzione può avere un comando associato a esso. Il comando viene eseguito quando viene attivato il punto di interruzione. Questo comando può essere trovato usando GetCommand e può essere modificato usando SetCommand.

Dimensione
Se il punto di interruzione è un punto di interruzione del processore, deve avere una dimensione specificata. Ciò determina le dimensioni del blocco di memoria il cui accesso attiverà il punto di interruzione, ovvero l'inizio del blocco è la posizione del punto di interruzione. Le dimensioni sono disponibili usando GetDataParameters e possono essere modificate usando SetDataParameters.

Tipo di accesso
Se il punto di interruzione è un punto di interruzione del processore, deve avere un tipo di accesso. Determina il tipo di accesso che attiverà il punto di interruzione. Ad esempio, il punto di interruzione può essere attivato se la destinazione legge, scrive in o esegue la memoria specificata dal punto di interruzione. Il tipo di accesso è disponibile usando GetDataParameters e può essere modificato usando SetDataParameters.

Parametri validi per i punti di interruzione del processore

I tipi di accesso seguenti sono disponibili per i punti di interruzione del processore:

Valore Descrizione

DEBUG_BREAK_READ

Il punto di interruzione verrà attivato quando la CPU legge la memoria nel blocco di memoria del punto di interruzione.

DEBUG_BREAK_WRITE

Il punto di interruzione verrà attivato quando la CPU scrive memoria nel blocco di memoria del punto di interruzione.

DEBUG_BREAK_READ | DEBUG_BREAK_WRITE

Il punto di interruzione verrà attivato quando la CPU legge o scrive memoria nel blocco di memoria del punto di interruzione.

DEBUG_BREAK_EXECUTE

Il punto di interruzione verrà attivato quando la CPU recupera l'istruzione nel blocco di memoria del punto di interruzione.

DEBUG_BREAK_IO

Il punto di interruzione verrà attivato quando si accede alla porta di I/O nel blocco di memoria dei punti di interruzione. (solo Windows XP e Microsoft Windows Server 2003, solo modalità kernel, solo x86)

Non tutti i tipi di accesso e le dimensioni sono supportati in tutti i processori. Sono supportati i tipi di accesso e le dimensioni seguenti:

x86
Tutti i tipi di accesso sono supportati. DEBUG_BREAK_READ si comporta come DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. Le dimensioni devono essere 1, 2 o 4. L'indirizzo del punto di interruzione deve essere un multiplo delle dimensioni.

x64
Tutti i tipi di accesso sono supportati. DEBUG_BREAK_READ si comporta come DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. Le dimensioni devono essere 1, 2, 4 o 8. L'indirizzo del punto di interruzione deve essere un multiplo delle dimensioni.