0

我遇到了一个我不知道如何调试的错误。错误是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)

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

4

1 回答 1

1

我建议使用ltrace, 来跟踪对openpipe函数的调用。此外,对于通常打开描述符的函数(例如openfilesocketpipe、 ) ,只需 grep 代码库也是一个好主意popen

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

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

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

于 2015-01-25T03:20:23.567 回答