Share via


Application Verifier – Testen von Anwendungen

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

So stellen Sie zuverlässige Windows-Anwendungen bereit:

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

Threadpoolprüfungen sind standardmäßig unter der Überschrift "Grundlagen" aktiviert. Da dies in der Standardeinstellung enthalten ist, müssen Benutzer nur Application Verifier für ihren Code mit den Standardeinstellungen ausführen, um diese und andere wichtige Überprüfungen zu nutzen.

Konfigurieren der Anwendungsüberprüfung

Debuggereinrichtung

Die zu überprüfende Anwendung sollte unter einem Debugger im Benutzermodus ausgeführt werden, oder das System sollte unter einem Kerneldebugger ausgeführt werden, da es bei einem Fehler in einen Debugger einbricht. Weitere Informationen zum Debugger finden Sie unter Application Verifier – Debugging Application Verifier Stops .

Einstellungen

Application Verifier kann nicht für einen ausgeführten Prozess aktiviert werden. Daher müssen Sie einstellungen wie unten beschrieben vornehmen und dann die Anwendung starten. Die Einstellungen sind persistent, bis sie explizit gelöscht werden. Unabhängig davon, wie oft Sie eine Anwendung starten, wird appVerifier aktiviert, bis die Einstellungen gelöscht werden.

Verwenden des Anwendungsüberprüfungsgrundlagentests

Die folgenden Szenarien veranschaulichen die empfohlenen Befehlszeilen- und Benutzeroberflächesoptionen. 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 den Debugger einbricht und alle Tests mit der gleichen Durchlaufrate ausgeführt werden, wie bei der Ausführung ohne aktivierten AppVerifier.

Aktivieren Sie die Überprüfung für die Anwendungen, mit denen Sie testen möchten. Über die Befehlszeile: appverif /verify MyApp.exe.

Über die Benutzeroberfläche: Fügen Sie Ihre Anwendung hinzu, indem Sie mit der rechten Maustaste im Bereich Anwendungen 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 werden, die die DLL ausübt.

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

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

Analysieren Sie alle aufgetretenen Debuggerunterbrechungen. Wenn ein Umbruch auftritt, müssen Sie ihn verstehen und beheben. HINWEIS: Die Hilfeinhalte enthalten Details zu den Unterbrechungen und deren Untersuchung.

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

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

Heapbeschädigung

Fast 10 % der Anwendungsabstürze auf Windows-Systemen sind auf Heapbeschädigung zurückzuführen. Diese Abstürze sind nach der Tat fast unmöglich zu debuggen. Die beste Möglichkeit, diese Probleme zu vermeiden, besteht darin, mit den Seiten heap-Features in Application Verifier zu testen. Es gibt zwei Varianten von Seiten heap: "Full" und "Light". Full ist die Standardeinstellung. Es erzwingt, dass ein Debugger sofort beendet wird, wenn eine Beschädigung erkannt wird. Dieses Feature MUSS unter dem Debugger ausgeführt werden. Es ist jedoch auch die anspruchsvollste Ressource. Wenn ein Benutzer Zeitsteuerungsprobleme hat und bereits ein Szenario unter "Full" Page Heap ausgeführt hat, werden diese Probleme wahrscheinlich durch Festlegen auf "Light" behoben. Darüber hinaus stürzt der Light Page-Heap erst ab, wenn der Prozess beendet wird. Es stellt zwar eine Stapelablaufverfolgung für die Zuordnung bereit, kann die Diagnose jedoch erheblich länger dauern als die Nutzung der vollständigen Entsprechung.

Verwenden von AppVerifier Low Resource Simulation (Fehlerinjektion)

Für dieses Szenario wird erwartet, dass die Anwendung nicht in den Debugger einbricht. Wenn Sie nicht in den Debugger einbrechen, haben Sie keine Fehler, 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 (Fehlerinjektion) 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 mit der rechten Maustaste im Bereich Anwendungen klicken und Anwendung hinzufügen auswählen. Wählen Sie im Bereich Tests die Option Simulation mit geringer Ressource aus. Klicken Sie auf die Schaltfläche Speichern.

Hinweis: Wenn Sie eine DLL testen, können Sie eine Low-Resource-Simulation (Fehlerinjektion) auf eine bestimmte DLL anstelle des gesamten Prozesses anwenden. Das Befehlszeilenformat lautet wie folgt:

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 Umbruch auftritt, müssen Sie ihn verstehen und beheben.

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

Hinweis: Die Ausführung mit und ohne Fehlerinjektion führt weitgehend unterschiedliche Codepfade in einer Anwendung durch, und daher müssen beide Szenarien ausgeführt werden, um den vollen Nutzen von AppVerifier zu nutzen.

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 zur weiteren Analyse über die Benutzeroberfläche oder Befehlszeile in XML konvertiert werden.

Um die XML-Dateien anzuzeigen, können Sie ein beliebiges Tool verwenden, um die XML-Datei anzuzeigen, z. B. importieren in Microsoft Excel – Importieren der XML-Datei in Excel und verwenden Sie Filter oder Pivot Tables, um die gesammelten Daten neu zu organisieren und zu analysieren.

Mithilfe der Befehlszeile

Die Anwendungsüberprüfung kann über die Benutzeroberfläche oder über Befehlszeilenoptionen verwendet werden.

Im Folgenden finden Sie Beispiele für die Verwendung der Befehlszeile (im Folgenden finden Sie 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 die Anwendungsüberprüfung für eine bestimmte Überprüfungsebene für zwei Anwendungen:

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

So aktivieren Sie zwei Ebenen namens 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 Für eine Anwendung ausgeführten Überprüfungen:

appverif -disable * -for notepad.exe

oder

appverif -delete settings -for notepad.exe

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

appverif –logtofile enable

appverif –logtofile disable

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

Befehlszeilensyntax der Anwendungsüberprüfung

Befehlszeilennutzung der Anwendungsüberprüfung:

-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 ein oder mehrere Ziele mit optionalen Eigenschaftenspezifizierern 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] …]

Dabei gilt:

LAYER ist ein Standardname für eine Überprüfungsebene. Wenn ein neuer Überprüfungsanbieter installiert ist, wird ein neuer Name der Überprüfungsebene verfügbar gemacht, der in der Befehlszeile verwendet werden kann. 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 beim Starten 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 den in der Befehlszeile erwähnten LAYER-Wert spezifisch ist. Beispielsweise verfügt die Handles-Ebene über Ablaufverfolgungen als -Eigenschaft.

VALUE ist ein Wert für die -Eigenschaft. Der Typ des Werts hängt vom Typ ab, der der Eigenschaft zugeordnet ist, und er wird erzwungen. Die derzeit unterstützten Typen sind: boolean (true/false), integer (decimal/octal/hex in C-Notation), string und multi-string (mit \0’ between strings and being terminated by \0\0'). Wenn VALUE nicht angegeben ist, bedeutet dies, dass der Benutzer diese Eigenschaft löschen und das Verhalten auf den Standardwert für die Eigenschaft rückgängig machen möchte.

STOP ist die Zahl (dezimal oder hexadezimal in der C-Notation) 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 wird, 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 Überprüfungsstopps unten):

  • ErrorReport
  • severity
  • 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 aktiviert. Wenn Sie beispielsweise zwei Ebenen namens X und Y für zieltest.exe mit den Eigenschaften X.DebugLevel und Y.DebugLevel aktivieren möchten, 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]

Dieser Befehl stempelt das Protokoll mit LOG_STAMP. 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äres Protokoll 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öglichen Wert 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 hintereinander. Geben Sie log=-2 in der Befehlszeile an, um auf das erste erstellte Protokoll zuzugreifen.

Tastenkombinationen für die Befehlszeile

Im Folgenden sind Tastenkombinationen aufgeführt:

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

Dabei gilt:

TARGET hat die gleiche Bedeutung wie oben beschrieben.

DIE WAHRSCHEINLICHKEIT ist die Wahrscheinlichkeit, Fehler zu injizieren. Muss ein Wert im Bereich 0,.1000000 sein. Wenn nicht angegeben, beträgt der Standardwert 5 %.

TIMEOUT ist das Zeitintervall in Millisekunden während des Prozessstarts, wenn keine Fehlerinjektion erfolgt. Dies erfolgt, damit der Prozess ordnungsgemäß gestartet werden kann, bevor Fehler auftreten. Wenn nicht angegeben, beträgt der Wert 500 msecs.

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

Beispiele:

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

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

Aktivieren von Details zur Fehlerinjektion

Wenn Sie die Befehlszeile /faults verwenden, wird die Fehlerinjektion nur für OLE_ALLOC und HEAP_ALLOC aktiviert. Sie können jedoch die Befehlszeile verwenden, um zu konfigurieren, welche Art der Fehlerinjektion Sie aktivieren möchten. Wenn Sie beispielsweise einen Fehler als 2 % in eine Registrierung oder Datei-API 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

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

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

STOP ist Stoppcode, z. B. 0x200 0x201

TARGET ist der Anwendungsname, z. B. foo.exe

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

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

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

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

0x00000040 bedeutet, dass der Debugger durch Generieren einer Verifier-Ausnahme beendet wird.

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

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

Für den Schweregrad kann WERT eine der folgenden Werte sein.

0x00000003 Informative Haltestelle.

0x0000000F Warnung.

0x0000003F Fehler.

Für flavor kann Value die Kombination der folgenden Werte sein.

0x00000002 Nicht fortlaufender Stopp.

0x00000010 Dieser Stopp wird nur einmal angezeigt. Sie wird im folgenden Testlauf ignoriert.

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

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

Konfigurieren Sie den Stoppcode 0x2700 als Unterbrechung des Debuggers (standardmäßig deaktiviert), speichern Sie ein Protokoll ohne Stapelablaufverfolgung, und machen Sie es nicht kontinuitätsfähig.

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

Überprüfungsstoppoptionen – Erweiterte Einstellungen

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

Zugriffsüberprüfungsstoppoptionen: Die Optionen zum Beenden der Überprüfung werden in einem Dialogfeld geändert, in dem die verfügbaren Optionen aufgeführt sind. So greifen Sie auf die Optionen zum Beenden der Überprüfung zu:

  1. Wählen Sie im Bereich Tests den Namen eines Tests aus.
  2. Wählen Sie im Menü Bearbeiten die Option Verifier Stop-Optionen aus, oder klicken Sie mit der rechten Maustaste auf den Test, und wählen Sie Verifier Stop-Optionen aus.

Optionen zum Beenden der Überprüfung

Sie können die folgenden Elemente pro prüfer stop listed ä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, bei dem die Ausführung des Prüfcodes deaktiviert wird.

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

  • Ignorieren
  • Information
  • Warnung
  • Fehler

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

Protokollieren in Datei: Ein Kontrollkästchen, das bei Auswahl der Option in der angegebenen Datei protokolliert wird.

Protokollstapelablaufverfolgung: Ein Kontrollkästchen, das die Stapelüberwachungen protokolliert, sobald sie verfügbar sind.

Keine Unterbrechung: Eine Option, um den Debugger nicht zu unterbrechen.

Ausnahme: Eine Option ohne Unterbrechung und Haltepunkt

Haltepunkt : Eine Option ohne Unterbrechung oder Ausnahme.

Sonstiges bietet zwei Optionen

Einmal beenden: Ein Kontrollkästchen, das bei Auswahl dieses Fehlers beim Testen einer Anwendung nur einmal beendet wird.

Nicht fortlaufend: Ein Kontrollkästchen, das bei Auswahl nicht erlaubt, den Vorgang fortzusetzen, ohne dies zu untersuchen.

Weitere Informationen

Application Verifier – Übersicht

Application Verifier – Features

Application Verifier – Tests in Application Verifier

Application Verifier – Stoppcodes und Definitionen

Application Verifier – Debuggen der Anwendungsüberprüfung wird beendet

Application Verifier – Häufig gestellte Fragen