【问题标题】:OCaml Unix ErrorOCaml Unix 错误
【发布时间】:2015-01-25 03:01:48
【问题描述】:

我遇到了一个不知道如何调试的错误。错误是Exception: (Unix.Unix_error "Too many open files" pipe "")。我没有打开任何文件,只打开了一个 Unix 进程。有人对如何调试有一些提示吗?

导致错误的函数是:

 let rec update_act_odrs ?(sec_to_wait = 0.0) () = 
    try         
      (act_odrs := active_orders ())
      |> fun _ -> Lwt_io.print "active_orders Updated\n"
    with _ ->   
      Lwt_unix.sleep sec_to_wait
      >>= update_act_odrs ~sec_to_wait:(sec_to_wait +. 1.0)

active_orders () 是一个从服务器获取 JSON 数据的函数。

【问题讨论】:

  • 也许active_orders 函数可以打开文件?无论如何不要想lwt,sleepprint不要打开任何文件。

标签: unix ocaml ocaml-lwt


【解决方案1】:

我建议使用ltrace 来跟踪对openpipe 函数的调用。此外,对于通常打开描述符的函数,只需 grep 您的代码库,例如openfilesocketpipepopen

另外,你应该知道,失败的函数并不总是万恶之源。描述符可以被进程中的其他进程或函数吃掉。

您还可以查看/proc 文件夹,如果您在Linux 上,以确保您的进程实际上吃了这么多fds。也许,您的系统中有另一个进程,它由您的应用程序启动,它负责 fd 泄漏。

最后,从您展示的代码中,我可以得出结论,泄漏源只能是active_orders 函数。如果它从服务下载json 数据,它应该打开一个套接字连接。错误信息指向管道的事实很奇怪,可能是用popensystem 函数实现的。

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多