Freigeben über


Anatomie einer DbgEng-Erweiterungs-DLL

Eine DbgEng-Erweiterungs-DLL exportiert eine Reihe von Rückruffunktionen, von denen einige Implementierungen von Erweiterungsbefehlen sein können.

Diese Erweiterungs-DLLs werden von der Debugger-Engine geladen und können zusätzliche Funktionen oder Automatisierung von Aufgaben bereitstellen, während sie das Debuggen im Benutzermodus oder kernelmodus unter Microsoft Windows ausführen.

Wenn Sie eine vollständige Installation der Debugtools für Windows durchgeführt haben, finden Sie im Unterverzeichnis sdk\samples\exts des Installationsverzeichnisses eine DbgEng-Beispielerweiterung namens "exts".

Erweiterungsbefehle

Eine Erweiterungs-DLL kann eine beliebige Anzahl von Funktionen exportieren, die zum Ausführen von Erweiterungsbefehlen verwendet werden. Jede Funktion wird explizit als Export in der DEF-Datei deklariert, und ihr Name muss vollständig aus Kleinbuchstaben bestehen.

Funktionen, die zum Implementieren von Erweiterungsbefehlen verwendet werden, müssen mit dem Prototyp PDEBUG_EXTENSION_CALL.

Diese Funktionen werden gemäß der C++-Standardkonvention benannt, mit der Ausnahme, dass Großbuchstaben nicht zulässig sind. Der Name der exportierten Funktion und der Erweiterungsbefehl sind identisch, mit der Ausnahme, dass der Erweiterungsbefehl mit einem Ausrufezeichen (!) beginnt. Wenn Sie beispielsweise myextension.dll in den Debugger laden und dann !stack in das Fenster Debuggerbefehl eingeben, sucht der Debugger nach einer exportierten Funktion namens stack in myextension.dll.

Wenn myextension.dll noch nicht geladen ist oder andere Erweiterungsbefehle mit demselben Namen in anderen Erweiterungs-DLLs vorhanden sind, können Sie !myextension.stack in das Debuggerbefehlsfenster eingeben, um die Erweiterungs-DLL und den Erweiterungsbefehl in dieser DLL anzugeben.

Andere exportierte Funktionen

Eine DbgEng-Erweiterungs-DLL muss DebugExtensionInitialize exportieren. Dies wird aufgerufen, wenn die DLL geladen wird, um die DLL zu initialisieren. Es kann von der DLL verwendet werden, um globale Variablen zu initialisieren.

Eine Erweiterungs-DLL kann DebugExtensionUninitialize exportieren. Wenn dies exportiert wird, wird sie aufgerufen, bevor die Erweiterungs-DLL entladen wird. Sie kann von der DLL verwendet werden, um sauber zu können, bevor sie entladen wird.

Eine Erweiterungs-DLL kann DebugExtensionNotify exportieren. Wenn dies exportiert wird, wird sie aufgerufen, wenn eine Sitzung beginnt oder endet, und wenn ein Ziel gestartet oder beendet wird. Diese Benachrichtigungen werden auch für IDebugEventCallbacks-Objekte bereitgestellt, die bei einem Client registriert sind.

Eine Erweiterungs-DLL kann KnownStructOutput exportieren. Wenn dies exportiert wird, wird sie aufgerufen, wenn die DLL geladen wird. Diese Funktion gibt eine Liste von Strukturen zurück, die die DLL in einer einzigen Zeile drucken kann. Es kann später aufgerufen werden, um Instanzen dieser Strukturen für den Druck zu formatieren.

Engineprozedur zum Laden einer DbgEng-Erweiterungs-DLL

Wenn eine Erweiterungs-DLL geladen wird, werden die Rückruffunktionen vom Modul in der folgenden Reihenfolge aufgerufen:

  1. DebugExtensionInitialize wird aufgerufen, damit die Erweiterungs-DLL initialisiert werden kann.

  2. Beim Exportieren wird DebugExtensionNotify aufgerufen, wenn das Modul über eine aktive Sitzung verfügt, und erneut aufgerufen, wenn die Sitzung angehalten und zugänglich ist.

  3. Beim Exportieren wird KnownStructOutput aufgerufen, um eine Liste von Strukturen anzufordern, die die DLL weiß, wie in einer einzelnen Zeile gedruckt werden soll.

Informationen zum Laden und Entladen einer Erweiterungs-DLL mit dem Debugger finden Sie unter Laden von Debuggererweiterungs-DLLs und unter Verwenden von Debuggererweiterungsbefehlen informationen zum Ausführen eines Erweiterungsbefehls.

Das Debuggermodul platziert einen try/except-Block um einen Aufruf einer Erweiterungs-DLL. Dies schützt die Engine vor einigen Arten von Fehlern im Erweiterungscode. Da die Erweiterungsaufrufe jedoch im selben Thread wie die Engine ausgeführt werden, können sie trotzdem zum Absturz führen.