在Windows上捕获子进程异常

时间:2010-11-30 13:58:16

标签: windows debugging exception exception-handling seh

我正在开发一个多平台C ++模糊测试应用程序。该应用程序生成子进程并检查它是否意外停止。我已经设法在linux上做到这一点,但是,Windows异常处理机制对我来说很难。

我的代码现在执行以下操作: - 调用CreateProcess来生成进程。 - WaitForSingleObject等待它终止。 - 然后调用GetExitCodeProcess并检查退出代码是否对应于异常。

一切正常,我已经使用null解除引用测试应用程序对其进行了测试,我可以优雅地捕获异常。但是,每次测试时,Windows错误消息框都会生成告诉我发送或不发送错误报告。由于模糊器应该是一个自动测试应用程序,我需要以某种方式禁用此通知,这样即使发现异常,模糊器也可以继续测试。

我已经尝试过安装SEH处理程序,但没有运气(显然这些处理程序不是由子进程继承的)。我已经阅读了一些关于使用向量异常处理的内容,但是假设它是相同的,我相信矢量处理程序不会被继承。

有人可以帮我解决这个问题吗?我不知道该搜索什么,我已经google了很多,并没有发现任何问题。

谢谢!

3 个答案:

答案 0 :(得分:2)

Debug API是一种选择。 Here是MSDN的起点。

答案 1 :(得分:2)

根据frast的回答,您可以将流程作为具有合适SetErrorMode的流程的生成。这个(可继承的)设置决定了哪些错误会导致对话框弹出 - 我在尝试为自动化测试应用程序完成同样的事情时发现了你的问题。

要避免任何错误对话框,请使用

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX);

注入可能有点过分 - 最好使用包装器进程。

答案 2 :(得分:1)

尝试将以下代码注入您的子进程:

SetErrorMode(SEM_NOGPFAULTERRORBOX);

在MSDN中查找SetErrorMode的详细信息。

在这里阅读注射技术: Injective Code inside Import Table