Condividi tramite


Anatomia di una DLL dell'estensione DbgEng

Una DLL di estensione DbgEng esporta una serie di funzioni di callback, alcune delle quali possono essere implementazioni di comandi di estensione.

Queste DLL di estensione vengono caricate dal motore del debugger e possono fornire funzionalità aggiuntive o automazione delle attività durante l'esecuzione di debug in modalità utente o in modalità kernel in Microsoft Windows.

Se è stata eseguita un'installazione completa di Strumenti di debug per Windows, è possibile trovare un'estensione DbgEng di esempio denominata "exts" nella sottodirectory sdk\samples\exts della directory di installazione.

Comandi di estensione

Una DLL di estensione può esportare qualsiasi numero di funzioni usate per eseguire i comandi di estensione. Ogni funzione viene dichiarata in modo esplicito come esportazione nel file con estensione def e il relativo nome deve essere costituito interamente da lettere minuscole.

Le funzioni usate per implementare i comandi di estensione devono corrispondere al prototipo PDEBUG_EXTENSION_CALL.

Queste funzioni sono denominate in base alla convenzione C++ standard, tranne che le lettere maiuscole non sono consentite. Il nome della funzione esportato e il nome del comando di estensione sono identici, ad eccezione del fatto che il comando di estensione inizia con un punto esclamativo (!). Ad esempio, quando si carica myextension.dll nel debugger e quindi si digita !stack nella finestra Comando debugger, il debugger cerca una funzione esportata denominata stack in myextension.dll.

Se myextension.dll non è già caricato o se potrebbero essere presenti altri comandi di estensione con lo stesso nome in altre DLL di estensione, è possibile digitare !myextension.stack nella finestra comando debugger per indicare la DLL di estensione e il comando di estensione in tale DLL.

Altre funzioni esportate

Una DLL dell'estensione DbgEng deve esportare DebugExtensionInitialize. Verrà chiamato quando viene caricata la DLL per inizializzare la DLL. Può essere usato dalla DLL per inizializzare le variabili globali.

Una DLL di estensione può esportare DebugExtensionUninitialize. Se questa operazione viene esportata, verrà chiamata prima che la DLL dell'estensione venga scaricata. Può essere usato dalla DLL per pulire prima che venga scaricato.

Una DLL di estensione può esportare DebugExtensionNotify. Se questa operazione viene esportata, verrà chiamata quando una sessione inizia o termina e quando viene avviata o interrotta l'esecuzione di una destinazione. Queste notifiche vengono fornite anche agli oggetti IDebugEventCallback registrati con un client.

Una DLL di estensione può esportare KnownStructOutput. Se viene esportato, verrà chiamato quando viene caricata la DLL. Questa funzione restituisce un elenco di strutture che la DLL sa come stampare in una singola riga. Può essere chiamato in seguito per formattare le istanze di queste strutture per la stampa.

Procedura del motore per il caricamento di una DLL dell'estensione DbgEng

Quando viene caricata una DLL di estensione, le funzioni di callback vengono chiamate dal motore nell'ordine seguente:

  1. DebugExtensionInitialize viene chiamato in modo che la DLL di estensione possa inizializzare.

  2. Se esportato, DebugExtensionNotify viene chiamato se il motore ha una sessione attiva e viene chiamato di nuovo se la sessione viene sospesa e accessibile.

  3. Se esportato, KnownStructOutput viene chiamato per richiedere un elenco di strutture che la DLL sa come stampare in una singola riga.

Per informazioni su come usare il debugger per caricare e scaricare una DLL di estensione, vedere Caricamento delle DLL dell'estensione debugger per informazioni sull'esecuzione di un comando di estensione .

Il motore del debugger inserisce un tentativo/ ad eccezione di un blocco intorno a una chiamata a una DLL di estensione. Ciò protegge il motore da alcuni tipi di bug nel codice di estensione; ma, poiché le chiamate di estensione vengono eseguite nello stesso thread del motore, possono comunque causare l'arresto anomalo.