Uso dell'input e dell'output

Per una panoramica dei flussi di input e di output nel motore del debugger, vedere Input e Output.

Input

Il motore chiederà l'input da tutti i client se il metodo Input viene chiamato su un client. L'input viene restituito al chiamante di Input.

Callback di input

Quando il motore chiede l'input da un client, usa l'oggetto IDebugInputCallbacks registrato con tale client. Un oggetto IDebugInputCallbacks può essere registrato con un client usando SetInputCallbacks. Ogni client può avere al massimo un oggetto IDebugInputCallbacks registrato con esso.

La richiesta di input inizia con il motore che chiama il metodo IDebugInputCallbacks::StartInput . In questo modo viene informato l'oggetto IDebugInputCallbacks che il motore è in attesa di input.

Se l'oggetto IDebugInputCallbacks ha un input per il motore, può chiamare il metodo ReturnInput di qualsiasi client. Dopo aver chiamato il metodo ReturnInput , il motore non accetta più input. I chiamanti successivi di questo metodo verranno informati che l'input non è stato ricevuto.

Il motore chiamerà quindi IDebugInputCallbacks::EndInput per indicare che è stato arrestato in attesa dell'input.

Infine, il motore eseguirà l'eco di questo input all'oggetto IDebugOutputCallbacks registrato di ogni client (tranne quello usato per fornire l'input) usando IDebugOutputCallbacks::Output con la maschera bit impostata su DEBUG_OUTPUT_PROMPT.

Output

L'output può essere inviato al motore usando diversi metodi client, ad esempio Output e OutputVaList. Al momento della ricezione dell'output, il motore lo invia ad alcuni client.

I client usano una maschera di output per indicare quali tipi di output sono interessati. Ogni volta che l'output viene prodotto dal motore, viene accompagnato da una maschera che specifica il tipo di output. Se il tipo di output corrisponde alla maschera di output del client, il client riceverà l'output. La maschera di output può essere impostata chiamando SetOutputMask e sottoposto a query usando GetOutputMask. Per informazioni dettagliate sui valori della maschera di output, vedere DEBUG_OUTPUT_XXX .

L'elenco dei client a cui il motore invierà l'output è controllato dal controllo di output. In genere, il controllo di output è impostato per inviare l'output a tutti i client; tuttavia, può essere modificato temporaneamente usando ControlledOutput e ControlledOutputVaList. Per informazioni dettagliate sui valori dei controlli di output, vedere DEBUG_OUTCTL_XXX .

L'output può essere memorizzato nel buffer dal motore. Se più parti di output vengono passate al motore, possono raccoglierle e inviarle ai client in un pezzo di grandi dimensioni. Per scaricare questo buffer, usare FlushCallbacks.

Ogni oggetto client ha una larghezza di output, ovvero la larghezza della visualizzazione dell'output per l'oggetto client. Anche se questa larghezza viene usata solo come hint, alcuni comandi e funzioni di estensione formattano l'output in base a questa larghezza. La larghezza viene restituita dal metodo GetOutputWidth e può essere impostata usando il metodo SetOutputWidth.

Callback di output

Quando il motore invia l'output a un client, usa l'oggetto IDebugOutputCallbacks registrato con il client. Un oggetto IDebugOutputCallbacks può essere registrato con un client usando SetOutputCallbacks. Ogni client può avere al massimo un oggetto IDebugInputCallbacks registrato con esso.

Per inviare l'output, il motore chiama il metodo IDebugOutputCallbacks::Output .

Prefisso della riga di output

Ogni oggetto client ha un prefisso della riga di output che viene preceduto da ogni riga di output inviata al callback di output associato all'oggetto client. Questa operazione può essere usata per rientro o per inserire segni di identificazione in ogni riga di output.

Il prefisso della riga di output viene restituito da GetOutputLinePrefix e può essere impostato usando SetOutputLinePrefix. Per modificare temporaneamente il prefisso della riga di output e modificarlo di nuovo, usare PushOutputLinePrefix e PopOutputLinePrefix.

File di log

Il motore del debugger supporta l'apertura di un file di log per registrare una sessione di debug. Al massimo, un file di log può essere aperto alla volta. L'output inviato ai callback di output viene inviato anche a questo file di log (a meno che non venga contrassegnato per non essere registrato).

Per aprire un file di log, usare OpenLogFile2 (o OpenLogFile). Il metodo GetLogFile2 (o GetLogFile) restituisce il file di log attualmente aperto. Per chiudere il file di log, usare CloseLogFile.

Il metodo SetLogMask può essere usato per filtrare l'output inviato al file di log e GetLogMask restituirà il filtro del file di log corrente.

Richiesta

In una sessione di debug interattivo, è possibile usare un prompt per indicare all'utente che il debugger è in attesa dell'input dell'utente. Il prompt viene inviato ai callback di output usando i metodi OutputPrompt e OutputPromptVaList . Il contenuto del prompt standard viene restituito da GetPromptText.