Linux 中的 SEH 等效项或如何处理操作系统信号(如 SIGSERV)并继续继续

2023-11-22

我目前正在开发一个单元测试框架,用户可以在其中创建测试用例并在框架中注册。

我还想确保,如果任何用户测试代码导致崩溃,它不应该使整个框架崩溃,而应该被标记为失败。为了实现这项工作,我编写了以下代码,以便我可以在沙盒功能中运行用户代码

bool SandBox(void *(*fn)(void *),void *arg, void *rc)
{
#ifdef WIN32
    __try
    {
        if (rc)
            rc = fn(arg);
        else
            fn(arg);
        return true;
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        return false;
    }

#else
#endif
}

这在 Windows 上完美运行,但我希望我的框架是可移植的,为了实现这一点,我想确保 posix 环境具有类似的功能。

我知道 C 信号处理程序可以拦截操作系统信号,但将信号处理机制转换为 SEH 框架存在某些我无法解决的挑战

  1. 即使我的程序收到信号,如何继续执行?
  2. 如何将执行控制从失败位置跳转到可用于错误处理的块(类似于 except)?
  3. 如何清理资源?

我正在考虑在具有自己的信号处理程序的单独线程上运行用户测试代码的另一种可能性,并从信号处理程序终止线程,但再次不确定这是否可行。

因此,在我进一步思考之前,如果社区知道有更好的解决方案来解决这个问题/情况,我希望得到社区的帮助。


正如你所说,你可以通过捕获 SIGSEGVsignal() or sigaction().

继续并不是真正可取的,因为这将是未定义的行为,即您的内存可能会被损坏,这可能会让其他测试用例也失败(甚至过早终止整个过程)。

是否可以将测试用例作为子流程一一运行?这样,您可以检查退出状态,并检测它是否完全终止、出现错误或由于信号而终止。

在单独的线程中运行测试用例会遇到同样的问题:测试用例和驱动测试用例的代码之间没有内存保护。

建议的方法是:

fork()创建一个子进程。

在子进程中,您execve()你的测试用例。这可以是相同的二进制文件,具有不同的参数来选择特定的测试用例)。

在父进程中,您调用waitpid()等待测试用例的终止。您从以下位置收到了 pidfork()调用父进程。

使用 WIFEXITED、WEXITSTATUS、WIFSIGNALED、WTERMSIG 宏评估子流程状态。

如果您的测试用例需要超时,您还可以安装 SIGCHLD 的处理程序。如果超时先到,kill()子进程。请注意,您只能从信号处理程序中调用某些函数。

进一步说明:execve()并不是真正需要的。您可以继续并直接调用您指定的测试用例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 中的 SEH 等效项或如何处理操作系统信号(如 SIGSERV)并继续继续 的相关文章

随机推荐

  • .htaccess 重定向不适用于 Angular 4

    我知道很多人问这个问题 但我查看了所有答案 但没有任何效果 我确信问题是我需要创建一个 htaccess 文件并将其添加到我的 dist 中 因为这就是 ISP 控制台指南所说的要做的事情 我正在使用 Angular cli 和构建命令 n
  • 为什么我的比较方法有时会抛出 IllegalArgumentException?

    我遇到这个问题已经有一段时间了 搜索了很多 StackOverflow 问题但无法解决我的问题 我之前也问过类似的问题并得到了使用建议 System setProperty java util Arrays useLegacyMergeSo
  • 计算整数数组中的重复元素

    我有一个整数数组crr array我想计算重复出现的元素 首先 我读取数组的大小并使用从控制台读取的数字对其进行初始化 在数组中new array 我存储重复的元素 数组times存储元素连续出现的次数 然后 我尝试搜索重复序列并以特定格式
  • 文件“xxx.mp4”无法打开,因为您无权查看它

    我使用阿拉莫菲尔方法multipartFormData append URL withName file 将视频上传到服务器 但我收到一条错误消息 multipartEncodingFailed Alamofire AFError Mult
  • 无效的回发或回调参数错误?

    我有两个下拉列表 我使用 javascript 根据另一个下拉列表填充一个 在我的 javascript 代码中 我调用一个网络服务 并根据返回的结果填充另一个下拉列表 问题是 在我成功完成此操作后 开始出现以下错误 回发或回调参数无效 事
  • python中的学生t置信区间

    我有兴趣使用 python 计算学生 t 的置信区间 我在 Mathematica 中使用 StudentTCI 函数 现在需要在 python 中编写相同的函数http reference wolfram com mathematica
  • NOTIFYICONDATA - GUID 问题

    根据 NOTIFYICONDATA 结构的 guidItem 成员的描述http msdn microsoft com en us library bb773352 v vs 85 aspx使用 Windows 系统托盘的程序需要在 Win
  • Sweave 输出中的语法高亮显示

    有没有人设法让颜色语法突出显示在outputSweave 文档 我已经能够通过在中添加框等来自定义输出样式Sweave sty文件如下 DefineVerbatimEnvironment Sinput Verbatim fontseries
  • 如何在一个类中多次使用一个特征?

    以下代码 trait T function foo class C use T T foo as bar use T T foo as baz 产生以下错误 Trait方法bar还没有应用 因为有碰撞 与 C 上的其他特征方法 是否可以在一
  • JQuery 函数的持久化

    我正在尝试为 HTML 设置点击回调 使另一个节点变得可见 一路走来 我惊讶地发现以下两条语句并不等价 title click content toggle title click function content toggle 当最终单击
  • 构建项目时出错:构建播放器时出错,因为脚本在编辑器中存在编译错误

    我有 Tiled2Unity 插件 当我开始在 Unity 中构建游戏版本时 无论是独立版本还是其他版本 我收到以下错误 构建播放器时出错 因为脚本在编辑器中存在编译错误 然后它向我指出了这个课程 using System using Sy
  • 直接从文件系统获取文件校验和,而不是显式计算它

    我猜测典型的文件系统倾向于保留其管理的每个文件的某种校验和 CRC 哈希 因此它可以检测文件损坏 这个猜测正确吗 如果是的话 有没有办法访问它 我主要对 Windows 和 NTFS 感兴趣 但也欢迎对其他平台的评论 语言在这一点上并不重要
  • onCreateLoader 方法中与 AsyncTaskLoader 和 Fragment 一起使用的不兼容类型

    我考虑了一些使用 AsyncTaskLoader 和 Fragment 的示例 https gist github com codeswimmer 884591 我也尝试做同样的事情 但现在我无法修复 onCreateLoader 方法中的
  • Django 1.3 静态文件放置在应用程序目录中

    我正在使用 Django 1 3 应用程序中的静态文件令人困惑 我在做什么 1 设置 STATIC ROOT as path to directory static in my project STATIC URL static 2 在我的
  • 为什么 bool 到 string 的隐式转换不会出错?

    我用谷歌搜索并试图在 SO 上找到类似的问题 但没有找到任何有用的东西 所以 在这里发布我的问题 考虑这个程序 include
  • 写入文本文件php

    我正在使用 php 我想编写一个 php 页面来从另一个页面获取参数并写入文件文本 和 如果已有文件文本 则写入新行 每天创建一个文件文本 Example 注册 php
  • 如何在C#中获取相对路径中的文件

    如果我有一个名为 app exe 的可执行文件 这是我在 C 中编码的内容 那么如何使用相对路径从与 app exe 加载到同一目录中的文件夹中获取文件 这会引发路径异常中的非法字符 string files Directory GetFi
  • 无法在 Android Studio 3.6 上启用 Gradle 的离线模式

    我正在使用新的Android Studio 3 6 金丝雀 9测试新功能 我无法启用 Gradle 的离线模式 在 Android Studio 首选项窗口的 Gradle 选项卡中 我找不到启用它的入口点 这是一个错误还是 Google
  • Xcode 中多个目标的自动递增构建号

    我的应用程序有 免费 和 付费 版本 并且我想同时自动增加两个版本号 因为有时我使用 免费 版本进行测试 有时我使用 付费 版本进行测试 具体取决于关于我正在做的事情 这些本质上是相同的代码库 我只有两个目标 其中带有用 付费 版本定义的预
  • Linux 中的 SEH 等效项或如何处理操作系统信号(如 SIGSERV)并继续继续

    我目前正在开发一个单元测试框架 用户可以在其中创建测试用例并在框架中注册 我还想确保 如果任何用户测试代码导致崩溃 它不应该使整个框架崩溃 而应该被标记为失败 为了实现这项工作 我编写了以下代码 以便我可以在沙盒功能中运行用户代码 bool