2009-06-16 2 views
3

Ich führe ein Projekt, das Interprozess COM mit C++ verwendet. Auf der obersten Ebene der aufgerufenen Funktionen gibt es try/catch-Anweisungen direkt vor der Rückkehr durch COM. Der Catch konvertiert alle C++ - Ausnahmen in benutzerdefinierte Fehlercodes, die über die COM-Schicht an den Aufrufer zurückgegeben werden.Kann ich COM davon abhalten, nicht abgefangene C++ - Ausnahmen im aufgerufenen Prozess zu verschlucken?

Zum Debuggen möchte ich dieses try/catch deaktivieren und die Ausnahme einfach einen Absturz im aufgerufenen Prozess verursachen lassen (wie es normalerweise bei einer nicht abgefangenen C++ - Ausnahme passieren würde). Leider scheint mir die COM-Grenze diese nicht abgefangenen C++ - Ausnahmen zu verschlucken und ich bekomme keinen Absturz.

Gibt es eine Möglichkeit, dieses Verhalten in COM zu ändern? Dh, ich möchte, dass die nicht abgefangene C++ - Ausnahme einen Absturz im aufgerufenen Prozess verursacht.

Ich möchte, dass dies geschieht, damit ich einen Debugger anhängen kann und den Kontext sehen, in dem die Ausnahme ausgelöst wird. Wenn ich unseren Versuch/Fang einfach an Ort und Stelle belasse und den Haltepunkt auf den Haken bringe, dann ist der Stapel bereits abgewickelt und das ist für mich zu spät.

Die ursprünglichen "COM-Master", die diese Anwendung geschrieben haben, sind entweder nicht verfügbar oder können sich nicht genug Details merken.

+0

Die Beschreibungen sieht seltsam aus. Ist es ein in Proc-COM-Server? Meine Erfahrung ist, dass mit einem In-Process-Server alle Ausnahmen glücklich über die COM-Grenze weitergegeben werden und den aufrufenden Prozess zum Absturz bringen. – sharptooth

+0

"Ich führe ein Projekt, das ** inter-process ** COM mit C++ verwendet." – pauldoo

Antwort

-1

Was Sie brauchen, ist "Break, wenn eine Ausnahme ausgelöst wird" in Ihrem Debugger zu aktivieren. Auf diese Weise hören Sie sofort auf, wenn eine Ausnahme ausgelöst wird, und haben den gesamten Call-Stack zu Ihren Diensten.

+0

Leider stoppt mich das bei jeder Ausnahme, die ausgelöst wird. Ich möchte nur auf nicht abgefangene Ausnahmen verzichten. – pauldoo

2

Ich glaube nicht, dass Sie dieses Verhalten deaktivieren können, aber es gibt einen Weg um es, wenn Sie Visual Studio verwenden und nichts dagegen haben, in Ausnahmen überschwemmt. Wenn Sie zu Debug> Exceptions in VS wechseln und wenn C++ - Ausnahmen in dem Debugger "für die Ausnahmebedingung ausgelöst werden" auswählen, wird es in dem Debugger an dem Punkt abgelegt, an dem die Ausnahme ausgelöst wird. Leider können Sie dann herausfinden, welche Ausnahmen Sie ignorieren können und welche für Sie interessant sind.

Die Standardeinstellung dafür ist "Weiter" mit "Wenn die Ausnahme nicht behandelt wird" wird auf "In den Debugger einbrechen" gesetzt. Wenn dies nicht bereits geschieht, würde dies bedeuten, dass Sie genau herausfinden müssen, wo die Ausnahmen abgefangen werden.

+0

Ich habe ein Problem hier, dass ich nicht unbedingt an den Prozess vor dem Absturz angeschlossen werden möchte. Ich möchte die Anwendung normal ausführen, habe aber die Möglichkeit, den Absturzdialog anzuhängen. (Genau wie bei normalen Anwendungsabstürzen) – pauldoo

+0

Ich habe versucht zu untersuchen, wo COM die Ausnahme verschluckt hat und es hat mich tief in die Eingeweide von COM geführt, die ich nicht wirklich verstanden habe. Vielleicht sollte ich das verfolgen. – pauldoo

+0

Es kann einen anderen Weg geben, wenn Sie ungefähr wissen, wo im Code die Ausnahme liegt. Es ist ein bisschen böse und nur Debuggen, aber Sie könnten "throw" mit einem Makro ersetzen, das ein "__asm ​​int 3" ausgibt. vor der eigentlichen throw-Anweisung. Auf diese Weise erhalten Sie einen Debug-Haltepunkt für jede Anweisung. Das im Produktionscode zu belassen, ist natürlich eine * wirklich * schlechte Idee. –

0

Sie können einen Debugger der Ebene 2 im Debugger mit sxe/sxd -c2 eh einrichten, der nur unbehandelte C++ - Exceptions abfängt. Sie können den Debugger während des Ladens auch direkt an Ihren Prozess anhängen, indem Sie GFlags verwenden. Natürlich müssten Sie die aufgeben und the real deal verwenden.

2

Wenn ich richtig verstehe, ist Ihr Problem im Wesentlichen die Unfähigkeit, eine Stapelüberwachung von einer C++ Ausnahme zu erhalten. Ich habe es nie selbst ausprobiert, aber es sollte tatsächlich möglich sein, den Stack-Trace sogar innerhalb des Catch-Blocks zu bekommen.

See: Getting an exception call stack from the catch block

Der Artikel beschreibt den Prozess der Stack-Trace immer mit einem Debugger, aber wenn Sie nicht wollen angebracht werden Sie einen Dump in der catch-Klausel erstellen (one way, another) und dann gehen Sie in Ihrer Freizeit durch den Prozess.

1

Werfen Sie einen Blick auf Vectored Exception Handlers - abhängig von Ihrem genauen Anwendungsfall könnte VEH verwendet werden, um die SEH-Ausnahmebehandlung abzufangen und Crashs/​​Dumps/was auch immer zu erzwingen.