Condividi tramite


Controllo di un programma durante il debug

Il controllo di un programma durante il debug consiste nell'impostazione di punti di interruzione nel codice gestito, nell'esecuzione del debug passo a passo di codice gestito e non gestito e nella gestione delle eccezioni first-chance e second-chance. Nelle sezioni seguenti viene descritto il modo in cui un debugger utilizza l'API di debug di Common Language Runtime per eseguire queste attività.

Impostazione di un punto di interruzione nel codice gestito

Nell'elenco seguente viene fornita una descrizione dettagliata del modo in cui viene impostato un punto di interruzione nel codice gestito:

Debug passo a passo di codice gestito e non gestito

Nell'elenco seguente viene fornita una descrizione dettagliata del modo in cui un debugger esegue il debug passo a passo del codice gestito.

  1. Una volta specificato il thread nel quale eseguire il debug passo a passo, il debugger crea un gestore di istruzioni. Chiama quindi il metodo ICorDebugThread::CreateStepper per il thread del quale viene eseguito il debug passo a passo. In alternativa, il debugger può chiamare il metodo ICorDebugFrame::CreateStepper per il frame in relazione al quale deve essere eseguito il debug passo a passo. Si presuppone che il processo venga arrestato al momento della creazione del gestore di istruzioni.

  2. Il debugger esegue il debug passo a passo del thread chiamando il metodo ICorDebugStepper::Step.

  3. Il debugger prosegue l'esecuzione del processo chiamando il metodo ICorDebugController::Continue per il processo dell'oggetto del debug corrente.

  4. L'API di debug informa il debugger che il passaggio è stato completato. L'API di debug chiama il metodo ICorDebugManagedCallback::StepComplete per l'oggetto che il debugger aveva registrato con il runtime.

  5. Il debugger esegue nuovamente il debug passo a passo del thread chiamando il metodo ICorDebugStepper::Step.

  6. Il debugger prosegue l'esecuzione del processo chiamando il metodo ICorDebugController::Continue per il processo dell'oggetto del debug corrente.

Nell'elenco seguente vengono descritti metodi alternativi per il debug passo a passo con codice non gestito:

  • Il debugger può ignorare il debug passo a passo nel codice nativo. Il debugger chiama il metodo ICorDebugStepper::StepOut per ignorare il debug passo a passo del codice nativo finché il frame precedente non viene riattivato. L'API di debug chiama il metodo ICorDebugManagedCallback::StepComplete quando si torna al codice gestito.

  • Il debugger può facoltativamente eseguire il debug passo a passo della successiva sezione di codice gestito. Il debugger chiama il metodo ICorDebugStepper::Step in modo che il controllo venga restituito al debugger quando si torna al frame di codice gestito precedente oppure quando il codice non gestito chiama nuovo codice gestito.

  • Il debugger prosegue l'esecuzione del processo chiamando il metodo ICorDebugController::Continue per il processo dell'oggetto del debug corrente.

  • L'API di debug informa il debugger che sta eseguendo il debug passo a passo del codice non gestito chiamando il metodo ICorDebugUnmanagedCallback::DebugEvent.

Gestione delle eccezioni

Nell'elenco seguente viene fornita una descrizione dettagliata del modo in cui vengono gestite le eccezioni first-chance e second-chance:

  1. CLR informa il debugger che si è verificata un'eccezione first-chance. L'API di debug chiama il metodo ICorDebugManagedCallback::Exception sull'interfaccia ICorDebugManagedCallback registrata dal debugger con il runtime.

  2. Il debugger ottiene informazioni sull'eccezione. Il debugger chiama il metodo ICorDebugThread::GetCurrentException sull'oggetto ICorDebugThread al quale era stato passato nel callback per ottenere un oggetto eccezione (ICorDebugValue).

  3. Il debugger ottiene l'oggetto ICorDebugObjectValue per l'eccezione. Il debugger chiama il metodo QueryInterface per ottenere l'oggetto ICorDebugObjectValue per l'eccezione.

  4. Il debugger ottiene la classe dell'oggetto eccezione che era stato generato chiamando il metodo ICorDebugObjectValue::GetClass.

  5. Il debugger decide di ignorare l'eccezione e continua il processo.

  6. CLR informa il debugger che si è verificata un'eccezione second-chance. L'API di debug chiama il metodo ICorDebugManagedCallback::Exception e specifica che l'eccezione è di tipo second-chance.

  7. L'utente decide che l'eccezione è irrilevante. Il debugger chiama il metodo ICorDebugThread::ClearCurrentException per il thread dell'oggetto del debug corrente. Questo metodo cancella l'eccezione e impedisce che venga generata.

  8. Il debugger prosegue l'esecuzione del processo chiamando il metodo ICorDebugController::Continue per il processo dell'oggetto del debug corrente.

Vedere anche

Altre risorse

Cenni preliminari sul debug CLR

Debug (riferimenti alle API non gestite)