2009-08-21 8 views
4

Eine MFC, C++ - Anwendung, an der ich arbeite, scheint eine Ausnahme tief in einen Gerätetreiber zu werfen. (Es ist eine Zugriffsverletzung schreiben auf einen NULL-Zeiger aus dem Aussehen der Dinge. Die Details des Absturzes sind nicht das, was mich jetzt interessiert, aber ...)Wie kann man sehen, wo eine Ausnahme gefangen wird?

Ich kann den Visual Studio Debugger zu brechen, wenn die Ausnahme tritt durch das Dialogfeld Ausnahmen auf. Was ich jedoch gerne wissen möchte, ist, wo die Ausnahme gefangen wird. Visual Studio kann die Ausnahmebedingung an das zu debuggende Programm weitergeben, aber es scheint nicht (wie ich weiß) der einzige Schritt zur nächsten Anweisung zu sein, damit ich den Callstack aus der Sicht des Ausnahmebehandlers betrachten kann.

Weiß jemand, ob es möglich ist, zu dem Ausnahmebehandler zu gelangen, der die Ausnahme abfängt oder nicht?

Cheers, James

+0

Wenn Sie wissen, wo es behandelt wird, können Sie dort Haltepunkt setzen, aber ich denke, Sie wollen es an erster Stelle finden :). – Eugene

+0

Welche Version von Visual Studio verwenden Sie? Es ist mir nicht klar, ob Sie den Quellcode für den Gerätetreiber haben. –

Antwort

0

An dem Punkt, wenn die Ausnahme sollten Sie einen Call-Stack für Sie in dem Debugger geworfen wird - durch an jedem Stapelrahmen von dem Punkt des Wurfes zu main suchen, Sie sollten in der Lage sein, den ersten Frame mit einem try/catch Block zu finden, der den Aufruf an die nächste Routine im Frame bindet. Solange der Block try/catch den Typ der ausgelösten Ausnahme behandelt, wird er dort landen.

1

Mit WinDbg können Sie den Befehl !exchain verwenden. Mit !exchain -c zeigt es Ihre C++ - Destruktoren und Catch-Blöcke. z.B.

Try block 0 
Catch block 0, type: module!my_exception `RTTI Type Descriptor'+0 (6071409c) 
       handler: module!catch_block+582 (6063bcc2) 

Dann können Sie einen Haltepunkt mit bp 6063bcc2 gesetzt.

Ich kenne keine Möglichkeit, dies in Visual Studio zu tun.

Verwandte Themen