在windows上捕获子进程异常

发布于 2024-10-05 08:28:18 字数 542 浏览 2 评论 0 原文

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

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

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

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

有人可以帮我解决这个问题吗?我不知道要搜索什么,我已经用谷歌搜索了很多,但没有找到任何东西。

谢谢!

i'm developing a multi-platform C++ fuzzing application. The app spawns a child process and checks whether it stopped unexpectedly. I've already managed to do this on linux, however, windows exception handling mechanism is making things hard for me.

My code right now does the following:
- Call CreateProcess to spawn the process.
- WaitForSingleObject to wait for it to terminate.
- Then call GetExitCodeProcess and check if the exit code corresponds to an exception.

Everything works as it should, i've tested it with a null dereferencing test application, and i can catch the exception gracefully. However, each time i test this, a Windows error message box spawns telling me to Send or Not Send the error report. Since the fuzzer is supposed to be an automatic testing application, i'd need to somehow disable this notification, so that even if an exception is caught, the fuzzer can continue testing.

I've already tried installing a SEH handler, but had no luck(apparently these handlers aren't inherited by child processes). I've read something about using vectored exception handling, but suppose it would be the same, i believe vector handlers aren't inherited.

Could anybody help me with this problem? I don't know what to search for, i've already googled a lot and haven't found anyhing.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

︶ ̄淡然 2024-10-12 08:28:18

调试 API 是一种选择。 此处是 MSDN 中的起点。

Debug API is one option. Here is a starting point in MSDN.

做个少女永远怀春 2024-10-12 08:28:18

根据frast的答案,您可以将进程作为具有合适子生成=VS.85%29.aspx" rel="nofollow">设置错误模式。此(可继承)设置确定哪些错误将导致弹出对话框 - 我在尝试为自动化测试应用程序实现完全相同的事情时发现了您的问题。

为了避免任何错误对话框,使用

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX);

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

Following on frast's answer, you can spawn the process as a child of a process with a suitable SetErrorMode. This (inheritable) setting determines which errors will result in dialogs popping out - I found your question while trying to achieve the exact same thing for an automated testing application.

To avoid any error dialogs, use

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX);

Injection is probably overkill - better to use a wrapper process.

暮色兮凉城 2024-10-12 08:28:18

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

SetErrorMode(SEM_NOGPFAULTERRORBOX);

查找

在这里阅读有关注射技术的信息:
导入表内的注入代码

Try to inject the following code into your child process:

SetErrorMode(SEM_NOGPFAULTERRORBOX);

Lookup the details of SetErrorMode in MSDN.

Read about injection technique here:
Injective Code inside Import Table

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文