Verwenden des Debuggers und der Logexts.dll
Eine Möglichkeit zum Aktivieren der Protokollierung besteht darin, CDB oder WinDbg zu starten und wie gewohnt an eine Zielanwendung im Benutzermodus anzufügen. Verwenden Sie dann den Erweiterungsbefehl !logexts.logi oder !logexts.loge .
Dadurch wird Code am aktuellen Haltepunkt eingefügt, der zu einer Routine springt, die Logexts.dll im Zielanwendungsprozess lädt und initialisiert. Dies wird als "Injizieren der Protokollierung in die Zielanwendung" bezeichnet.
Es werden tatsächlich zwei Instanzen von Logexts.dll ausgeführt, da dieses Modul sowohl eine Debuggererweiterungs-DLL als auch das Programm ist, das in die Zielanwendung eingefügt wird. Der Debugger und die Zielinstanzen von Logexts.dll über einen freigegebenen Speicherabschnitt kommunizieren, der die Ausgabedateihandles, die aktuelle Kategoriemaske und einen Zeiger auf den Protokollausgabepuffer enthält.
Anfügen an die Zielanwendung
Informationen zum Anfügen des Debuggers an die Zielanwendung finden Sie unter Debuggen eines User-Mode Prozesses mithilfe von WinDbg oder Debuggen eines User-Mode Prozesses mithilfe von CDB.
Verwenden der Protokollierungserweiterungsbefehle
Die vollständige Syntax jeder Erweiterung finden Sie auf der entsprechenden Referenzseite.
!logexts.logi
Fügt die Protokollierung in die Zielanwendung ein. Dadurch wird die Protokollierung initialisiert, aber nicht aktiviert.
!logexts.loge
Aktiviert die Protokollierung. Wenn !logexts.logi nicht verwendet wurde, wird diese Erweiterung initialisiert und dann die Protokollierung aktiviert.
!logexts.logd
Deaktiviert die Protokollierung. Dies führt dazu, dass alle API-Hooks entfernt werden, um die freie Ausführung des Programms zu ermöglichen. COM-Hooks werden nicht entfernt, da sie nicht nach Be willen wieder aktiviert werden können.
!logexts.logo
Zeigt Ausgabeoptionen an oder ändert sie. Drei Arten von Ausgabe sind möglich: Direkt an den Debugger gesendete Nachrichten, eine Textdatei oder eine LGV-Datei. Die LGV-Datei enthält viel mehr Informationen als die anderen beiden; Sie kann mit LogViewer gelesen werden.
Wenn Sie die Textdateiausgabe deaktivieren, wird weiterhin eine .txt Datei der Größe 0 erstellt. Dadurch kann eine zuvor gespeicherte Textdatei am selben Speicherort überschrieben werden.
!logexts.logc
Zeigt verfügbare API-Kategorien an, steuert, welche Kategorien protokolliert werden und welche nicht, und zeigt die APIs an, die in jeder Kategorie enthalten sind.
Wenn eine Kategorie deaktiviert ist, werden die Hooks für alle APIs in dieser Kategorie entfernt, sodass kein Leistungsmehraufwand mehr entsteht. COM-Hooks werden nicht entfernt, da sie nicht nach Be willen wieder aktiviert werden können.
Das Aktivieren nur bestimmter Kategorien kann nützlich sein, wenn Sie nur an einer bestimmten Art von Interaktion interessiert sind, die das Programm mit Windows hat, z. B. Dateivorgänge. Dies reduziert die Größe der Protokolldatei und verringert auch die Auswirkungen der Protokollierung auf die Ausführungsgeschwindigkeit des Prozesses.
!logexts.logb
Zeigt den aktuellen Ausgabepuffer an oder leert diese. Aus Leistungsgründen wird die Protokollausgabe nur dann auf den Datenträger geleert, wenn der Ausgabepuffer voll ist. Standardmäßig beträgt der Puffer 2144 Bytes.
Da der Pufferspeicher von der Zielanwendung verwaltet wird, erfolgt das automatische Schreiben des Puffers in die Protokolldateien auf dem Datenträger nicht, wenn eine Zugriffsverletzung oder ein anderer nicht wiederherstellbarer Fehler in der Zielanwendung vorliegt. In solchen Fällen sollten Sie diesen Befehl verwenden, um den Puffer manuell auf den Datenträger zu leeren. Andernfalls werden die zuletzt protokollierten APIs möglicherweise nicht in den Protokolldateien angezeigt.
!logexts.logm
Zeigt eine Moduleinschluss-/Ausschlussliste an oder erstellt sie. Es ist häufig wünschenswert, nur die API-Aufrufe zu protokollieren, die aus einem bestimmten Modul oder einer reihe von Modulen erfolgen. Um dies zu vereinfachen, können Sie mit Logger eine Moduleinschlussliste oder alternativ eine Modulausschlussliste angeben. Für instance würden Sie eine Aufnahmeliste verwenden, wenn Sie nur Aufrufe von einem oder zwei Modulen protokollieren möchten. Wenn Sie Aufrufe aus allen Modulen mit Ausnahme einer kurzen Liste von Modulen protokollieren möchten, verwenden Sie eine Ausschlussliste. Die Module Logexts.dll und Kernel32.dll sind immer ausgeschlossen, da logger sich nicht selbst protokollieren darf.