我正在开发一个多平台的C ++模糊应用程序。 该应用程序产生一个subprocess,并检查它是否意外停止。 我已经设法做到这一点在Linux上,但是,Windowsexception处理机制正在让我难过。
我的代码现在执行以下操作: – 调用CreateProcess生成进程。 WaitForSingleObject等待它终止。 然后调用GetExitCodeProcess并检查退出代码是否对应于exception。
一切工作,因为它应该,我已经testing了一个空的解引用testing应用程序,我可以捕捉exception优雅。 但是,每次我testing这个,一个Windows错误消息框产生告诉我发送或不发送错误报告。 由于fuzzer应该是一个自动testing应用程序,我需要以某种方式禁用此通知,以便即使发现exception,fuzzer可以继续testing。
我已经尝试安装SEH处理程序,但没有运气(显然这些处理程序不是由subprocessinheritance)。 我读过一些关于使用向量化exception处理的内容,但是假设它是一样的,我相信vector处理程序不会被inheritance。
有人可以帮我解决这个问题吗? 我不知道要search什么,我已经GOOGLE了很多,没有find任何东西。
谢谢!
调试API是一个选项。 这是MSDN的一个起点。
在frast的回答之后,您可以使用合适的SetErrorMode将流程产生为流程的子 节点 。 这个(可继承的)设置决定了哪些错误会导致对话框弹出 – 我发现你的问题,同时试图为自动化测试应用程序实现完全相同的事情。
要避免任何错误对话框,请使用
SetErrorMode( SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
注射可能是矫枉过正 – 更好地使用包装过程。
尝试将以下代码注入到您的子进程中:
SetErrorMode(SEM_NOGPFAULTERRORBOX);
在MSDN中查找SetErrorMode的详细信息。
阅读有关注射技术在这里: 内部导入表内的代码