我是否可以阻止COM在被调用进程中吞噬未捕获的C ++异常?

时间:2009-06-16 10:04:23

标签: c++ exception com

我正在维护一个使用进程间COM与C ++的项目。在被调用函数的顶层,在通过COM返回之前直接有try / catch语句。 catch将任何C ++异常转换为通过COM层传递回调用者的自定义错误代码。

出于调试的目的,我想禁用这个try / catch,并简单地让异常导致被调用进程崩溃(通常会发生未被捕获的C ++异常)。对我来说不幸的是,COM边界似乎吞没了这些未被捕获的C ++异常并且我没有崩溃。

有没有办法在COM中更改此行为?即,我希望它允许未被捕获的C ++异常导致被调用进程崩溃。

我希望这样做,以便我可以附加调试器并查看抛出异常的上下文。如果我只是将try / catch放在原地,并在catch上断点,那么堆栈已经解开了,所以这对我来说太迟了。

编写此应用程序的原始“COM母版”都不可用或无法记住足够的细节。

6 个答案:

答案 0 :(得分:3)

问题提出后的一年半......

Raymond Chen撰写了一篇关于“How to turn off the exception handler that COM 'helpfully' wraps around your server”的文章。似乎是问题的最终答案。如果不是OP,对未来的读者。

答案 1 :(得分:2)

我认为你不能禁用这种行为,但如果你使用的是Visual Studio并且不介意在异常中泛滥,那么就有办法解决这个问题。如果您转到VS中的Debug> Exceptions并选择“当抛出异常>进入调试器时”,对于C ++异常,它将在抛出异常时进入调试器。不幸的是,你可以找出你可以忽略哪些例外以及哪些例外你感兴趣。

默认设置为“Continue”,“如果未处理异常”设置为“进入调试器”。如果它不这样做,那么这表明您必须确切地找出异常被捕获的位置。

答案 2 :(得分:2)

如果我理解正确,你的问题基本上是无法从C ++异常中获取堆栈跟踪。我自己从未尝试过,但实际上甚至可以从catch块中获取堆栈跟踪。

请参阅:Getting an exception call stack from the catch block

本文描述了使用调试器获取堆栈跟踪的过程,但是如果您不希望附加一个,则可以在catch子句中创建转储(one wayanother) ,然后经过你的休闲过程。

答案 3 :(得分:1)

查看Vectored Exception Handlers - 根据您的确切用例,VEH可用于拦截SEH异常处理并强制崩溃/转储/无论如何。

答案 4 :(得分:0)

您可以使用sxe/sxd -c2 eh在调试器中设置2级中断,这将仅捕获未处理的C ++异常。您还可以使用GFlags在加载时动态地将调试器附加到您的流程。当然,您必须放弃mickey mouse debugger并使用the real deal

答案 5 :(得分:-1)

您需要在调试器中启用“在抛出异常时中断”。这样,当抛出异常并在您的服务中拥有整个调用堆栈时,您将立即停止。