【发布时间】:2012-10-16 11:44:41
【问题描述】:
标题说得最多,真的。在 Linux 上,它会是 easy 和 strace,可能还有 lsof 或 /proc,在 OSX 上它曾经很容易,直到从 OSX Leopard 中删除 truss 以及底层系统调用 (afaik)。
显而易见的方法是使用dtrace 来解决这个问题,但是据我所知dtrace 不会这样做,因为它会在事件发生时捕获它们 - 在我的情况下,阻塞系统调用已经开始.顺便说一句,如果这可以通过dtrace 解决,我很乐意纠正。
我看到 Xcode 的 Instruments 有一个监视器,它通过定期对进程堆栈进行采样来实现类似的功能(不确定它依赖什么系统调用来做到这一点!),也许命令行上的类似功能就足够了(因为它将一直显示堆栈到包装系统调用的库调用)。为了对我的用例有用,这个“采样命令行工具”必须找到并解析它在堆栈上找到的参数,以便确定我们在哪个文件/文件描述符上被阻止。
最后一件事 - 在 Linux 上,您通常可以作为普通用户执行此操作(假设没有 ptrace_scope 技巧)。如果 OSX 解决方案也不需要 root,那就太好了。
【问题讨论】:
-
gdb attach PID和bt会给你你需要的东西吗? -
在 OSX 上可能不是
gdb,而是lldb私下建议的@kobyk。我仍在研究细节,但通过一些手动修补,我能够看到(a)哪个系统调用导致了块(b)它使用lldb有哪些参数。不需要root,向进程发送了一个信号(不知道为什么)。如果我得到比sample更好的地方,我会发布一个更完整的答案,如下所示。谢谢!
标签: macos instruments blocking strace dtrace