【问题标题】:monitor process for failure监控失败的过程
【发布时间】:2017-01-17 18:01:40
【问题描述】:

我正在开发一个简单的模糊测试工具,该工具涉及生成某些文件类型的有效实例并监视被测程序的故障。这个工具的一个关键组件是进程监控模块:这个模块应该提供函数,给定一个表示程序路径和参数的字符串(例如,corrupt.pyrandom_file.wav)指示调用currupt.py random_file.wav 是否会触发一些错误。

什么是最简单的方法来定义一个函数来监视这样一个过程以在 OCaml 中挂起或抛出一个错误?我计划在循环中运行这样一个函数,从而转移副作用(例如,内容打印到 std.out) 是至关重要的。这种函数的类型签名应该是字节 -> int,其中 int 有一些相关的含义(例如,0 -> 健康退出)。

此外,我知道停止问题使得无法判断停止是否是意外行为,所以我可以在任意等待时间画线。

【问题讨论】:

  • 退出代码说得不多。很多人try ... catch(..} {} return 0; 主要。我怀疑您是否可以在不知道被测应用程序应该做什么的情况下使其通用。例如。应该停止?然后,已经有很多(免费)测试套件可以做类似的事情......只需选择一个你喜欢的。
  • “已经有很多(免费)测试套件可以做类似的事情”我这样做是为了好玩,而不是原创。

标签: unix ocaml system


【解决方案1】:

您可以从 Unix“高级进程和重定向管理”函数开始,例如,create_process prog args new_stdin new_stdout new_stderr 是一个通用函数,它将创建一个运行程序的进程,它允许您重定向通道。创建的进程将异步运行,因此您可以使用waitpidWNOHANG 标志查看它,或者只是阻塞直到它结束(可能后者不适合您)。

或许,下面的界面应该可以满足你的需求:

 module Monitor : sig 

    val start : string -> t
    val terminate : t -> unit

    val on_finish : t -> (int -> unit) -> unit

    ... 
 end

或者你可以把它简化为

  val monitor : string -> (int -> 'a) -> 'a

如果您不想管理监视器实例。

或者,您可以查看Lwt high-level process management library。它可能会为您节省不少按键。还有来自 Janestreet 的替代 async unix library,您可以尝试一下。

【讨论】:

  • 如果您正在监视可能无法终止或可能无法完全终止的进程,那么我强烈推荐 @ivg 提到的 Lwt_process 模块。它使管理可能表现不佳的进程变得更加简单。如果您正在进行模糊测试,那么同时运行多个版本的可执行文件也相对简单,可能会减少完成测试所需的时间。
  • 此外,使用Lwt(或任何其他单子 IO 库)会更容易处理副作用,例如提供输入和处理 IO(包括网络)。原因有两个:首先 IO monad 操作是可组合的,这使得对程序的推理变得更加容易。其次,Async 和 Lwt 都是成熟的现代库,它们在标准库之上提供扩展功能。很难建议一个或另一个库,但我建议坚持使用 Lwt 进行研究/有趣的项目,并坚持使用 Async 进行工业级项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多