标题说得最多,真的。在 Linux 上,使用or可能很容易,并且在从 OSX Leopard 中删除之前,它曾经在 OSX 上很容易,以及底层系统调用(afaik)。strace
lsof
/proc
truss
显而易见的方法是用 来解决这个问题dtrace
,但据我所知dtrace
,它不会这样做,因为它会在事件发生时捕获它们 - 在我的情况下,阻塞系统调用已经开始。顺便说一句,如果这可以解决,我很乐意纠正dtrace
。
我看到 Xcode 的 Instruments 有一个监视器,它通过定期对进程堆栈进行采样来实现类似的功能(不确定它依赖于什么系统调用来做到这一点!),也许命令行上的类似功能就足够了(因为它会显示堆栈一直到包装系统调用的库调用)。为了对我的用例有用,这个“采样命令行工具”必须找到并解析它在堆栈上找到的参数,以便确定我们阻止了哪个文件/文件描述符。
最后一件事 - 在 Linux 上,您通常可以作为普通用户执行此操作(假设没有ptrace_scope
技巧)。如果 OSX 解决方案也不需要 root,那就太好了。