macos - 使用命令行工具确定 OSX 上的进程被什么阻塞?

标签 macos instruments blocking strace dtrace

标题确实说明了一切。在 Linux 上它将是 easystrace 以及可能的 lsof/proc 一起使用,在 OSX 上它曾经很容易,直到 truss 被删除OSX Leopard,以及底层系统调用(据我所知)。

显而易见的方法是使用 dtrace 来解决这个问题,但据我所知 dtrace 不会这样做,因为它会在事件发生时捕获事件 - 并且在我的情况是,阻塞系统调用已经开始。顺便说一下,如果这个问题可以通过 dtrace 解决,我很乐意接受纠正。

我看到 Xcode 的 Instruments 有一个监视器,它通过对进程堆栈进行定期采样来实现类似的功能(不确定它依赖什么系统调用来做到这一点!),也许命令行上的类似功能就足够了(因为它会一直显示堆栈到包装系统调用的库调用)。为了对我的用例有用,这个“采样命令行工具”必须查找并解析它在堆栈上找到的参数,以便确定我们阻止的文件/文件描述符。

最后一件事 - 在 Linux 上,您通常可以作为普通用户执行此操作(假设没有 ptrace_scope 技巧)。如果 OSX 解决方案也不需要 root,那就太好了。

最佳答案

您可以使用示例:示例PID -e

例如对于 nc -l localhost 5999 ,您将获得一个包含调用图的文件:

Call graph:
    9046 Thread_242504   DispatchQueue_1: com.apple.main-thread  (serial)
      9046 start  (in libdyld.dylib) + 1  [0x7fff90a847e1]
        9046 ???  (in nc)  load address 0x102453000 + 0x166c  [0x10245466c]
          9046 __accept  (in libsystem_kernel.dylib) + 10  [0x7fff94445996]

以及其他有用的信息,例如加载的二进制图像。

关于macos - 使用命令行工具确定 OSX 上的进程被什么阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13083034/

相关文章:

javascript - NodeJS 是否为每个请求创建一个新线程?

swift - 将字符串转换为 URL(为什么结果变量为 nil)

objective-c - 如何解决 NSTask 调用 -[NSString fileSystemRepresentation] 作为参数

ios - Xcode仪器可以在真正的Apple Watch设备上运行吗?

ios - 分配跟踪库未及时加载,无法查看堆栈跟踪

java - 阻止安卓设备

google-chrome - 谷歌浏览器中的阻塞时间

css - 如何让 WebKit WebView 使用 CSS 样式表?

swift - 如何制作自定义 NSDatePicker 单元格以更改选择颜色?

ios - NSPlaceHolderString 泄漏,Instruments 没有告诉我在哪里?