Freigeben über


Application Verifier – Testen von Anwendungen

Application Verifier (AppVerifier) ist ein Laufzeitüberprüfungstool für nicht verwalteten Code, der bei der Suche nach subtilen Programmierfehlern, Sicherheitsproblemen und eingeschränkten Problemen mit Benutzerkontenberechtigungen hilft, die mit normalen Anwendungstests schwer zu identifizieren sind.

So stellen Sie zuverlässige Windows-Anwendungen bereit:

  1. Testen Sie Anwendungen, die in nicht verwalteten (systemeigenen) Code mit Application Verifier unter dem Debugger und mit ganzseitigem Heap geschrieben wurden, bevor Sie diese für Kunden freigeben.
  2. Führen Sie die von Application Verifier bereitgestellten Schritte aus, um fehlerhafte Bedingungen zu beheben.
  3. Nachdem Ihre Anwendung veröffentlicht wurde, überwachen Sie regelmäßig die erfassten Anwendungsfehlerberichte, z. B. durch die Windows-Fehlerberichterstattung, falls verfügbar.

Threadpoolüberprüfungen sind standardmäßig unter der Überschrift „Grundlagen“ aktiviert. Da dies in der Standardeinstellung enthalten ist, müssen Benutzer die Anwendungsüberprüfung nur auf ihrem Code mit den Standardeinstellungen ausführen, um diese und andere wichtige Prüfungen zu nutzen.

Konfigurieren der Anwendungsüberprüfung

Debuggersetup

Die überprüfte Anwendung sollte unter einem Benutzermodusdebugger ausgeführt werden, oder das System sollte unter einem Kerneldebugger ausgeführt werden, da sie beim Auftreten eines Fehlers in einen Debugger unterteilt wird. Weitere Debuggerdetails finden Sie unter Application Verifier – Debugging Application Verifier stoppt.

Einstellungen

Die Anwendungsüberprüfung kann für einen ausgeführten Prozess nicht aktiviert werden. Daher müssen Sie einstellungen wie unten beschrieben vornehmen und dann die Anwendung starten. Die Einstellungen werden bis zum expliziten Löschen dauerhaft. Unabhängig davon, wie oft Sie eine Anwendung starten, wird sie mit "AppVerifier" aktiviert, bis die Einstellungen gelöscht werden.

Verwenden des Application Verifier Basics-Tests

Die folgenden Szenarien veranschaulichen die empfohlenen Befehlszeilen- und Benutzeroberflächenoptionen. Diese sollten während aller Tests ausgeführt werden, die den Code ausführen, um eine vollständige Abdeckung sicherzustellen. Die Erwartung für diese Szenarien besteht darin, dass die Anwendung nicht in debuggert und alle Tests mit der gleichen Passrate bestehen, wie bei der Ausführung ohne AppVerifier aktiviert.

Aktivieren Sie die Prüfer für die Anwendung(n), die Sie testen möchten. Über die Befehlszeile: appverif /verify MyApp.exe.

Über die Benutzeroberfläche: Fügen Sie Ihre Anwendung hinzu, indem Sie im Bereich "Anwendungen" mit der rechten Maustaste klicken und "Anwendung hinzufügen" auswählen. Wählen Sie im Bereich "Tests" die Grundlagen aus. Klicken Sie auf die Schaltfläche Speichern.

Hinweise:

/verify aktiviert die Grundlagentests.

Wenn Sie eine DLL testen, muss Application Verifier für die ausführbare Testdatei aktiviert sein, die die DLL ausübt.

Führen Sie die Überprüfungsebenen separat aus. Aktivieren Sie beispielsweise in einer Sitzung alle Grundlagen und auf einem anderen alle LuaPriv-Prüfungen.

Führen Sie ALLE Ihre Tests aus, die die Anwendung ausführen.

Analysieren Sie alle aufgetretenen Debuggerunterbrechungen. Wenn ein Bruch auftritt, müssen Sie ihn verstehen und korrigieren. HINWEIS: Die Hilfeinhalte enthalten Details zu den Umbrüchen und deren Untersuchung.

Wenn Sie fertig sind, löschen Sie alle Einstellungen. Über die Befehlszeile: appverif /n MyApp.exe.

Entfernen Sie auf der Benutzeroberfläche Ihre Anwendung, indem Sie im Bereich "Anwendungen" mit der rechten Maustaste klicken und "Anwendung löschen" auswählen. Klicken Sie dann auf die Schaltfläche "Speichern".

Heap-Korruption

Nahezu 10 % der Anwendungsabstürze auf Windows-Systemen sind auf eine Beschädigung des Heaps zurückzuführen. Diese Abstürze sind im Nachhinein fast unmöglich zu beheben. Am besten lassen sich diese Probleme vermeiden, wenn Sie mit den Page Heap-Funktionen von Application Verifier testen. Es gibt zwei Varianten von Page Heap: „Vollständig“ und „Leicht.“ „Vollständig“ ist der Standard. Er zwingt den Debugger zum sofortigen Anhalten, wenn er eine Beschädigung entdeckt. Diese Funktion muss während des Debuggers ausgeführt werden. Es ist jedoch auch die anspruchsvollste Ressource. Wenn ein Benutzer Probleme mit der Anzeigedauer hat und bereits ein Szenario unter „Vollständigem“ Page Heap ausgeführt hat, wird die Einstellung auf „Leicht“ diese Probleme wahrscheinlich beheben. Darüber hinaus stürzt Light Page Heap erst ab, wenn der Prozess beendet wird. Es liefert zwar der Speicherbelegung eine Stapelüberwachung, aber die Diagnose kann erheblich länger dauern als bei der Verwendung des vollständigen Gegenstücks.

Verwenden der AppVerifier Low Resource Simulation (Fehlereinfügung)

Die Erwartung für dieses Szenario besteht darin, dass die Anwendung nicht in debuggert. Wenn Sie nicht in den Debugger aufteilen, bedeutet dies, dass Keine Fehler auftreten, die behoben werden müssen.

Die Passrate für die Tests kann erheblich sinken, da zufällige Fehlerinjektionen in den normalen Betrieb eingeführt werden.

Aktivieren Sie die Application Verifier Low Resource Simulation (Fehlereinfügung) für die Anwendung(en). Über die Befehlszeile: Appverif /verify MyApp.exe /faults. Über die Benutzeroberfläche: Fügen Sie Ihre Anwendung hinzu, indem Sie im Bereich "Anwendungen" mit der rechten Maustaste klicken und "Anwendung hinzufügen" auswählen. Wählen Sie die Low Resource Simulation aus dem Testbereich aus. Klicken Sie auf die Schaltfläche Speichern.

Hinweis: Wenn Sie eine DLL testen, können Sie eine geringe Ressourcensimulation (Fehlereinfügung) auf eine bestimmte DLL anstelle des gesamten Prozesses anwenden. Das Befehlszeilenformat wäre:

appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]

Beispiel:

appverif /verify mytest.exe /faults 50000 1000 d3d9.dll

Ausführen aller Tests, die die Anwendung ausführen

Analysieren Sie alle aufgetretenen Debuggerunterbrechungen. Wenn ein Bruch auftritt, müssen Sie ihn verstehen und korrigieren.

Wenn Sie fertig sind, löschen Sie alle Einstellungen. Über die Befehlszeile: appverif /n MyApp.exe. Aus der Benutzeroberfläche: Entfernen Sie Ihre Anwendung, indem Sie im Bereich "Anwendungen" mit der rechten Maustaste klicken und "Anwendung löschen" auswählen, und klicken Sie auf die Schaltfläche "Speichern".

Hinweis: Das Ausführen mit und ohne Fehlereinfügungsübungen erfolgt weitgehend unterschiedlicher Codepfade in einer Anwendung und daher müssen beide Szenarien ausgeführt werden, um den vollen Vorteil von AppVerifier zu erhalten.

Verwenden von Application Verifier mit WOW64

Sie können entweder die 32-Bit- oder die 64-Bit-Version von Application Verifier verwenden, um eine 32-Bit-Anwendung zu überprüfen, die unter WOW64 ausgeführt wird.

Analysieren von AppVerifier-Daten

Alle während der AppVerifier-Analyse erstellten Daten werden im Ordner %USERPROFILE%\AppVerifierLogs in einem Binärformat gespeichert. Diese Protokolle können dann über die Benutzeroberfläche oder Befehlszeile zur weiteren Analyse in XML konvertiert werden.

Zum Anzeigen der XML-Dateien können Sie ein beliebiges Tool verwenden, um den XML-Code anzuzeigen, z. B. in Microsoft Excel importieren – importieren Sie die XML-Datei in Excel, und verwenden Sie Filter oder PivotTables, um die gesammelten Daten neu zu organisieren und zu analysieren.

Verwenden der Befehlszeile

Application Verifier kann über die Benutzeroberfläche oder über Befehlszeilenoptionen verwendet werden.

Im Folgenden finden Sie Beispiele für die Verwendung der Befehlszeile (unten sind die Details):

appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]

appverif /verify notepad

appverif -enable LAYER … -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …] 

appverif -disable LAYER ... -for TARGET ...

appverif -query LAYER ... -for TARGET ...

appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]

appverif –logtofile {enable|disable}

So aktivieren Sie application Verifier für eine bestimmte Überprüfungsebene für zwei Anwendungen:

appverif –enable Heaps Locks –for notepad.exe iexplore.exe

So aktivieren Sie zwei Ebenen mit dem Namen X und Y für ziel test.exe mit den Eigenschaften X.DebugLevel und Y.DebugLevel:

appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2

So deaktivieren Sie alle Prüfungen, die in einer Anwendung ausgeführt werden:

appverif -disable * -for notepad.exe

ODER

appverif -delete settings -for notepad.exe

So aktivieren oder deaktivieren Sie die Anwendungsüberprüfungsprotokollierung für alle Prozesse:

appverif –logtofile enable

appverif –logtofile disable

Die Protokollierung ist für alle Prozesse standardmäßig aktiviert.

Befehlszeilensyntax "Application Verifier"

Application Verifier-Befehlszeilenverwendung:

-enable TEST ... -for TARGET ... [-with [TEST.]PROPERTY=VALUE ...]
-disable TEST ... -for TARGET ...
-query TEST ... -for TARGET ...
-configure STOP ... -for TARGET ... -with PROPERTY=VALUE...
-verify TARGET [-faults [PROBABILITY [TIMEOUT [DLL ...]]]]
-export log -for TARGET -with To=XML_FILE [Symbols=SYMBOL_PATH] [StampFrom=LOG_STAMP] [StampTo=LOG_STAMP] [Log=RELATIVE_TO_LAST_INDEX]
-delete {logs|settings} -for TARGET ...
-stamp log -for TARGET -with Stamp=LOG_STAMP [Log=RELATIVE_TO_LAST_INDEX]
-logtoxml LOGFILE XMLFILE
-installprovider PROVIDERBINARY
-sppath [PROTECTED_PROCESS_LOG_PATH]
-cppath
-logtofile [enable | disable]

Die Befehlszeilensyntax akzeptiert eine oder mehrere Ebenen und wendet sie auf mindestens ein Ziel mit optionalen Eigenschaftsbezeichnern für Ebenen an.

appverif -enable LAYER ... -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …] appverif -disable LAYER ... -for TARGET ... appverif -query LAYER ... -for TARGET ... appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]

wo:

LAYER ist ein Standardname für eine Überprüfungsschicht. Wenn ein neuer Prüfanbieter installiert ist, macht dies einen neuen Überprüfungsebenennamen verfügbar, der in der Befehlszeile verwendet werden soll. Beispielebenen sind Heap, Handles oder Sperren.

Sie können LAYER auf * festlegen, um anzugeben, dass der Befehl für alle Ebenen gilt.

TARGET ist ein binärer Name (z. B. notepad.exe). Dies ist eine statische Einstellung, die in der Registrierung beibehalten wird und bei jedem Start der Anwendung berücksichtigt wird. Für den Befehl "appverif –disable" können Sie TARGET auf * festlegen, um anzugeben, dass alle Ziele deaktiviert werden sollen.

PROPERTY ist der Eigenschaftsname, der für die in der Befehlszeile erwähnte LAYER spezifisch ist. Beispielsweise verfügt die Handles-Ebene über Ablaufverfolgungen als Eigenschaft.

WERT ist ein Wert für die Eigenschaft. Der Typ des Werts hängt vom Typ ab, der der Eigenschaft zugeordnet ist und erzwungen wird. Die unterstützten Typen sind jetzt: boolean (true/false), ganze Zahl (dezimal/octal/hex in C-Schreibweise), Zeichenfolge und Multizeichenfolge (mit \0’ between strings and being terminated by \0\0'). Wenn WERT nicht angegeben ist, bedeutet dies, dass der Benutzer diese Eigenschaft löschen und das Verhalten auf den Standardwert für die Eigenschaft zurücksetzen möchte.

STOP ist die Zahl (Dezimal- oder Hexadezimalzahl in C-Schreibweise) des zu konfigurierenden Prüferstoppproblems. Die Stoppcodes müssen eindeutig sein (keine zwei Ebenen können denselben Stoppcode verwenden, daher bestimmt das Tool selbst, zu welcher Ebene der Stopp gehört).

STOPPROPERTY ist ein Eigenschaftsname, der für Prüferstopps akzeptabel ist. Wenn der Wert nicht angegeben ist, wird davon ausgegangen, dass die Eigenschaft gelöscht werden muss. Die zulässigen Eigenschaften für Stopps sind (weitere Details finden Sie unter Konfigurieren von Verifier-Stopps unten):

  • ErrorReport
  • Schweregrad
  • Geschmack

Die Eigenschaften können optional durch die Ebene qualifiziert werden, zu der sie gehören. Dies ist jedoch nicht erforderlich, wenn die Befehlszeile nur eine Ebene ermöglicht. Um beispielsweise zwei Ebenen mit dem Namen X und Y für Ziel-test.exe mit den Eigenschaften X.DebugLevel und Y.DebugLevel zu aktivieren, lautet der Befehl:

appverif –enable X Y –for test.exe –with X.DebugLevel=1 Y.DebugLevel=2

Wenn Layer X jedoch aktiviert ist, kann ein nicht qualifizierter Eigenschaftsname verwendet werden:

appverif –enable X –for test.exe –with DebugLevel=1

Das Trennzeichen zwischen Eigenschaftsname und Wert kann = (Gleichheitszeichen) oder : (Doppelpunkt) sein.

Verschiedene Befehle

appverif –query providers

appverif –delete logs –for TARGET ...

appverif –delete settings –for TARGET ...

Löschen Sie target vollständig aus der Registrierung.

appverif –stamp log –for Target –with Stamp=”LOG_STAMP”[Log= RELATIVE_TO_LAST_INDEX]

Mit diesem Befehl wird das Protokoll mit LOG_STAMP stempelt. Dieser Stempel ist nützlich, um nur einen Abschnitt eines Protokolls als relevant zu identifizieren, wenn das Protokoll im XML-Formular angezeigt wird.

appverif –export log –for TARGET –with To=XML_FILE[Symbols=SYMBOL_PATH][Stamp=LOG_STAMP][StampTo=LOG_STAMP][Log=RELATIVE_TO_LAST_INDEX]

Mit dem obigen Befehl wird ein Binärprotokoll in eine XML-Datei exportiert. Die optionale Stamp-Eigenschaft wird verwendet, um zu ermitteln, welcher Teil des Protokolls in XML exportiert werden soll. Wenn nicht angegeben, wird das gesamte Protokoll konvertiert. Die Log-Eigenschaft weist einen negativen ganzzahligen Wert als möglich auf und gibt an, welche Protokolldatei ab der letzten konvertiert werden soll (vorausgesetzt, wenn die Eigenschaft nicht vorhanden ist). Starten Sie beispielsweise notepad.exe dreimal in einer Zeile. Um auf das erste erstellte Protokoll zuzugreifen, geben Sie "Log=-2" in der Befehlszeile an.

Tastenkombinationen für die Befehlszeile

Es folgen Tastenkombinationen:

appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]

wo:

TARGET hat die gleiche Bedeutung wie oben beschrieben.

WAHRSCHEINLICHKEIT ist die Wahrscheinlichkeit, Fehler injizieren zu können. Muss ein Wert im Bereich 0,.10000000 sein. Wenn nicht angegeben, ist der Standardwert 5%.

TIMEOUT ist das Zeitintervall in Millisekunden beim Starten des Prozesses, wenn die Fehlereinfügung nicht auftritt. Dies geschieht, damit der Prozess ordnungsgemäß gestartet werden kann, bevor Fehler auftreten. Wenn der Wert nicht angegeben ist, beträgt der Wert 500 msecs.

DLL ist der Name des Moduls, das im Prozess geladen wird. In der Regel ist dies der Name einer dynamischen Bibliothek (Erweiterung .dll), kann jedoch ein ActiveX (Erweiterungs-OCX) oder ein anderes ladebares Modul sein.

Beispiele

appverif /verify notepad.exe /faults 100000 1000 msvcrt.dll

Aktivieren Sie die Fehlereinfügung für notepad.exe (wann immer sie gestartet wird). Fehler sollten mit Wahrscheinlichkeit 10%auftreten, nur 1000 msec nach dem Start des Prozesses und nur für Vorgänge, die von msvcrt.dllinitiiert werden.

Aktivieren von Fehlereinfügungsdetails

Wenn Sie die Befehlszeile /faults verwenden, wird die Fehlereinfügung nur für OLE_ALLOC und HEAP_ALLOC aktiviert. Sie können jedoch die Befehlszeile verwenden, um zu konfigurieren, welche Art von Fehlereinfügung Sie aktivieren möchten. Wenn Sie beispielsweise fehler in eine Registrierungs- oder Datei-API als 2%einfügen möchten, verwenden Sie die Befehlszeile:

appverif -enable lowres -for hello.exe -with registry=20000 file=20000

Ein weiteres Beispiel:

appverif -query lowres -for hello.exe

Settings for hello.exe:
Test [lowres] enabled.

Include = *
Exclude =
TimeOut = 2000 (0x7D0)
WAIT = 0 (0x0)
HEAP_ALLOC = 20000 (0x4E20)
VIRTUAL_ALLOC = 0 (0x0)
REGISTRY = 20000 (0x4E20)
FILE = 20000 (0x4E20)
EVENT = 0 (0x0)
MAP_VIEW = 0 (0x0)
OLE_ALLOC = 20000 (0x4E20)
STACKS = false

Konfigurieren von Verifier-Stopps

Mithilfe der Befehlszeile (oder Benutzeroberfläche) können Sie Prüferstopps konfigurieren. Im Folgenden sind Beispiele für die Nutzung aufgeführt:

Appverif -configure STOP ... -for TARGET ... -with PROPERTY=VALUE ...

STOP ist Stoppcode wie 0x200 0x201

TARGET ist Anwendungsname wie foo.exe

PROPERTY kann einer der Folgenden sein: "ErrorReport", "Severity" und "Flavor"

Für den ErrorReport kann WERT die Kombination der folgenden Werte sein.

0x00000001 bedeutet, dass der Stopp aktiv ist. (Wenn dieses Bit null ist, bedeutet dies, dass der Stopp deaktiviert ist)

0x00000020 bedeutet, dass der Stopp mithilfe eines Haltepunkts in den Debugger unterteilt wird.

0x00000040 bedeutet, dass der Unterbrechungsstopp in den Debugger durch Generieren einer Verifier-Ausnahme erfolgt.

0x00000080 bedeutet, dass der Stopp in der Protokolldatei protokolliert wird.

0x00000100 bedeutet, dass die Stapelablaufverfolgung für diesen Stopp in der Protokolldatei protokolliert wird.

Für den Schweregrad kann WERT einer der folgenden Werte sein:

0x00000003 Informativer Stopp.

0x0000000F Warnung.

0x0000003F Fehler.

Für den Geschmack kann "Value" die Kombination der folgenden Werte sein.

0x00000002 Nicht zusammenhängender Stopp.

0x00000010 Dieser Stopp wird nur einmal angezeigt. Sie wird innerhalb der Testausführung ignoriert.

Deaktivieren Sie z. B. Stopps 0x2700, 0x2701 für foo.exe

Appverif –configure 0x2700 0x2701 –for foo.exe –with ErrorReport=0

Konfigurieren von Stoppcode 0x2700 als Unterbrechung in Debugger (standardmäßig deaktiviert), Speichern eines Protokolls ohne Stapelablaufverfolgung und Nichtkontinuierbar machen

Appverif –configure 0x2700 –for foo.exe –with ErrorReport=0xA1 Flavor=0x2

Optionen für den Überprüfungsstopp – Erweiterte Einstellungen

Die Anwendungsüberprüfung verfügt über erweiterte Einstellungen, z. B. "Inaktivieren", die Sie pro Überprüfungsstopp ändern können.

Access Verifier Stop Options – Die Optionen für den Überprüfungsstopp werden in einem Dialogfeld geändert, in dem die verfügbaren Optionen aufgelistet sind. So greifen Sie auf die Optionen für den Überprüfungsstopp zu:

  1. Wählen Sie im Bereich "Tests" den Namen eines Tests aus.
  2. Wählen Sie im Menü "Bearbeiten" die Option "Kontrollkästchen beenden" aus, oder klicken Sie mit der rechten Maustaste auf den Test, und wählen Sie "Optionen für den Prüferstopp" aus.

Optionen für den Überprüfungsstopp

Sie können die folgenden Elemente pro Prüferstopp ändern, indem Sie auf den Stoppcode klicken (beachten Sie, dass eine Beschreibung des Stopps angezeigt wird, wenn darauf geklickt wird).

Inaktiv ist ein Kontrollkästchen, das die Ausführung des Codes für die Überprüfung deaktiviert.

Der Schweregrad bestimmt, wie der Prüferstopp gekennzeichnet werden soll:

  • Ignorieren
  • Informationen
  • Warnung
  • Fehler

Die Fehlerberichterstattung bestimmt, wie der spezifische Prüferstopp gemeldet/protokolliert werden soll:

Melden Sie sich bei Datei an – ein Kontrollkästchen, das bei Auswahl bei der vorgesehenen Datei protokolliert wird.

Protokollstapelablaufverfolgung – ein Kontrollkästchen, das beim Auswählen die Stapelablaufverfolgungen protokolliert, wenn sie verfügbar sind.

Kein Umbruch – eine Option, die im Debugger nicht umgebrochen werden soll.

Ausnahme – eine Option ohne Unterbrechung und Haltepunkt

Haltepunkt – eine Option ohne Unterbrechung oder Ausnahme.

Verschiedene Optionen

Einmal beenden – ein Kontrollkästchen, das beim Testen einer Anwendung nur bei diesem Fehler beendet wird.

Nicht kontinierbar - ein Kontrollkästchen, mit dem Sie nach Auswahl nicht fortfahren können, ohne zu untersuchen.

Siehe auch

Application Verifier – Übersicht

Application Verifier – Features

Application Verifier – Tests innerhalb von Application Verifier

Application Verifier - Stop Codes and Definitions

Application Verifier – Debuggen der Anwendungsüberprüfung beendet

Application Verifier – Häufig gestellte Fragen