我遇到了一个错误,我不确定如何调试。错误为 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
来跟踪对open
或pipe
函数的调用。此外,对于通常打开描述符的函数,最好只是 grep 您的代码库,例如 openfile
、socket
、pipe
、popen
。
此外,您应该知道,失败的功能并不总是邪恶的根源。描述符可以被流程中的其他进程或函数吃掉。
如果你使用的是 linux,你也可以查看/proc
文件夹,以确保你的进程实际上吃了很多fd
。也许,您的系统中还有另一个进程,该进程由您的应用程序启动,并且负责 fd 泄漏。
最后,从您展示的代码中,我可以得出结论,泄漏的来源只能是active_orders
函数。如果它从服务下载json
数据,它应该打开一个套接字连接。错误消息指向管道的事实很奇怪,也许它是通过popen
或system
函数实现的。