OCaml Unix Error



我遇到了一个错误,我不确定如何调试。错误为 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 Updatedn"
    with _ ->   
      Lwt_unix.sleep sec_to_wait
      >>= update_act_odrs ~sec_to_wait:(sec_to_wait +. 1.0)

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

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

此外,您应该知道,失败的功能并不总是邪恶的根源。描述符可以被流程中的其他进程或函数吃掉。

如果你使用的是 linux,你也可以查看/proc文件夹,以确保你的进程实际上吃了很多fd。也许,您的系统中还有另一个进程,该进程由您的应用程序启动,并且负责 fd 泄漏。

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

相关内容

  • 没有找到相关文章

最新更新