有任何工具可以跟踪 iOS 上特定文件的页面错误和其他相关事件吗?
Posted
技术标签:
【中文标题】有任何工具可以跟踪 iOS 上特定文件的页面错误和其他相关事件吗?【英文标题】:Any tool to trace page fault and other related events for a specific file on iOS? 【发布时间】:2018-11-01 11:51:24 【问题描述】:System Usage(Instruments)
似乎只跟踪显式文件 io 调用(open
、close
、write
、read
)。 System Trace(Instruments)
trace page fault
,不过是按调用栈组织的,过滤比较困难。
那么任何工具都可以跟踪特定文件的低级 io 事件?
【问题讨论】:
【参考方案1】:DTrace 可以做到这一点(至少在 Solaris 中,您必须在 macOS 上自己尝试一下)。 vm
提供程序具有名为 fspgin
、fspgout
和 fsfree
的探测器,它们分别在 FS 支持的页面被调入或调出内存时触发,或者如果它们未修改则被释放。还有一个更通用的称为maj_fault
,每当页面错误导致 IO 时就会触发。
唯一的问题是 DTrace 无法让您从这些探测器中返回文件名,如果您主要是在单个文件上出现页面错误,这可能没问题,或者如果您真的很烦人重新试图找出哪个文件是被分页的。但是,您仍然可以获得导致页面错误的进程的 execname
或 pid
,以防万一。
Here’s 您可以在其中查看vm
提供程序的文档。那里有一些示例脚本,但这个可能是最好用的:
vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin" && start == 0/
/*
* This is the first time that a vminfo probe has been hit; record
* our initial timestamp.
*/
start = timestamp;
vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin"/
/*
* Aggregate on the probename, and lquantize() the number of seconds
* since our initial timestamp. (There are 1,000,000,000 nanoseconds
* in a second.) We assume that the script will be terminated before
* 60 seconds elapses.
*/
@[probename] =
lquantize((timestamp - start) / 1000000000, 0, 60);
这会打印出每种故障类型的内存活动时间线,并且文档会更详细地解释它。
【讨论】:
【参考方案2】:这两个系统使用工具都依赖 Kdebug 来获取它们的信息。您可以使用内置的 ktrace(1)(或第三方工具,如 kdv (http://newosxbook.com/tools/kdv.html))直接监控 Kdebug(如果您是 root),其中任何一个都会为您提供所有 Kdebug 消息,并带有过滤器可以稍后使用 grep(1) 等应用。如果您启用了 SIP,则使用 Dtrace 将不起作用(并且在性能方面也很痛苦) - 因此 Kdebug 是一个不错的选择。
【讨论】:
以上是关于有任何工具可以跟踪 iOS 上特定文件的页面错误和其他相关事件吗?的主要内容,如果未能解决你的问题,请参考以下文章