Fehler: Unbehandelte Ausnahmefilter nicht im Debugger aufgerufen.

Artikel-ID: 173652 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Win32-Prozesse können eine nicht behandelte Ausnahme Filter-Funktion zum Abfangen von Ausnahmen, die nicht behandelt werden, in einen __try / __except-Block auf Basis eines prozessweiten installieren. Wenn einen Prozess zu debuggen, finden Sie, dass der Filter nicht behandelte Ausnahme nie ausgeführt wird, selbst wenn Sie einen Haltepunkt darin platzieren. Wenn der Prozess nicht gedebuggt wird, ist jedoch der Filter nicht behandelte Ausnahme aufgerufen, wie erwartet.

Ursache

Wenn von einem Prozess gedebuggt wird aufgerufen, wird die UnhandledExceptionFilter() Win32 API-Funktion den Anwendung installiert nicht behandelte Ausnahmefilter nicht aufgerufen.

Hinweis: Die UnhandledExceptionFilter()-API bestimmt, ob der Prozess gedebuggt wird. Wenn der Prozess gedebuggt wird, übergibt der UnhandledExceptionFilter-API die Ausnahme an dem Debugger. Anschließend ruft der UnhandledExceptionFilter-API nicht behandelte Ausnahmefilter für den Prozess.

Lösung

UnhandledExceptionFilter sollte den Filter nicht behandelte Ausnahme Anwendung installiert für Prozesse aufrufen, die zusätzlich zu den nicht gedebuggt wird gedebuggt werden.

Eine Möglichkeit zum Debuggen einer nicht behandelte Ausnahme Filter-Funktion besteht darin, setzen einen __try / __except-Block, um den gesamten Code innerhalb der main() oder WinMain() funktioniert wie folgt:
   void main (int argc, char **argv)
   {
      __try
      {
      // all of code normally inside of main or WinMain here...

      }
      __except (MyUnFilter (GetExceptionInformation()))
      {
         OutputDebugString ("executed filter function\n");
      }
   }
				
verhält dieser Arbeit um sich etwas anders aus eine nicht behandelte Ausnahmefilter, kann nur für den Thread ausführen, die main() oder WinMain()-Funktion aufgerufen werden. Wenn Sie einer Multithreadanwendung Debuggen, dann Sie eine ähnliche __try hinzufügen müssen / __except-Block innerhalb der einzelnen Thread-Funktion.

Wenn Sie nicht möchten Ausgaben hinzufügen neue __try / __except Speicherblöcke, um einen Filter nicht behandelte Ausnahme Debuggen, sollten Sie andere Methoden, die wie wie assert, Ablaufverfolgung, und Debuggen code zum Überprüfen des Verhaltens der Ausnahmehandler.

Status

Microsoft hat bestätigt, dass es sich dabei um einen Fehler in den Microsoft-Produkten handelt, die zu Beginn dieses Artikels aufgeführt sind. Wir werden dieses Problem untersucht und hier neue Informationen können in der Microsoft Knowledge Base werden gebucht werden, sobald Sie verfügbar sind.

Weitere Informationen

Eine nicht behandelte Ausnahme Filter-Funktion dient einem Prozess haben die Möglichkeit, um Ausnahmen zu reagieren, außerhalb jeder __try / __except-Block auftreten. Nicht behandelte Ausnahmefilter prozessweiten; Wenn jeder Thread eine Ausnahme ausgelöst wird, aber nicht behandelt, wird der Filter nicht behandelte Ausnahme aufgerufen. Sobald aufgerufen, die Filterfunktion beheben die Ursache der Ausnahme und fortsetzen kann, oder Sie können den Fehler an den Standardhandler für nicht behandelte Ausnahme, der der Prozess beendet wird übergeben.

Win32-Anwendungen können einen Filter prozessweiten nicht behandelte Ausnahme mit der SetUnhandledExceptionFilter()-API-Funktion installieren. Der Startcode für Microsoft Visual C++ C (c Runtime, CRT) Bibliothek implementiert einen __try / __except-Block, um die Main()-Funktion. Wenn eine Ausnahme durch diesen Block abgefangen wird, wird die Ausnahme Filter-Funktion mit dem Namen _XcptFilter, aufgerufen. _XcptFilter ist zwei Dinge: Es Signale, die von signal() CRT-Funktion verwendet die Win32-Ausnahmen zugeordnet und Signale in Ihre entsprechenden Handler verteilt. Wenn eine Signalbehandlungsroutine auf SIG_DFL festgelegt ist, (wie standardmäßig der Fall ist), _XcptFilter die UnhandledExceptionFilter()-API aufruft.

Die UnhandledExceptionFilter()-API bestimmt, ob der Prozess gedebuggt wird. Wenn dies der Fall ist, dann UnhandledExceptionFilter übergibt die Ausnahme zuerst an den Debugger, und dann aufrufen, den Prozess nicht behandelte Ausnahmefilter sollte.

Wenn der Prozess gedebuggt nicht ist, ruft UnhandledExceptionFilter den Prozess nicht behandelte Ausnahmefilter. Abhängig von der Filterfunktion zurückgeben, UnhandledExceptionFilter entweder zum Zeitpunkt der Ausnahme die Ausführung fortgesetzt oder zeigt ein System modalen Dialogfeld den Benutzer, die die Anwendung aufgrund einer unbehandelten Ausnahme beendet werden.

Schritte zum Reproduzieren des Verhaltens

Kompilieren Sie den folgenden Beispielcode, und legen Sie einen Haltepunkt in MyUnFilter. Beachten Sie, dass der Haltepunkt niemals erreicht ruft.
   /*
      Demonstrates how to use SEH so that unhandled exception filter
      can trap unhandled instructions.
   */ 

   #include <windows.h>
   #include <stdio.h>

   LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo);

   void main (void)
   {
      LPBYTE lpBuff = NULL;

      SetUnhandledExceptionFilter (MyUnFilter);

      *lpBuff = 54;
   }


   LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo)
   {
      static int s_SigCount = 0;

      DWORD dwExceptCode = lpExceptionInfo -> ExceptionRecord ->
                           ExceptionCode;
      LONG  lResult;

      if (dwExceptCode == EXCEPTION_ACCESS_VIOLATION)
      {
         printf ("access violation caught by MyUnFilter\n");

         ++s_SigCount;

         // test case to keep this from going on forever (since we're not
         // fixing the AV)
            if (s_SigCount < 5)
               lResult = EXCEPTION_CONTINUE_EXECUTION;
            else
               lResult = EXCEPTION_EXECUTE_HANDLER;

      }
      else
         lResult = EXCEPTION_CONTINUE_SEARCH;

      return lResult;
   }
				

Eigenschaften

Artikel-ID: 173652 - Geändert am: Dienstag, 21. November 2006 - Version: 4.4
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Win32 Application Programming Interface, wenn verwendet mit:
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Keywords: 
kbmt kbbug kbexcepthandling kbkernbase kbpending KB173652 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 173652
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns