有任何工具可以在iOS上跟踪特定文件的页面错误和其他相关事件吗



System Usage(Instruments)似乎只跟踪显式文件io调用(openclosewriteread(。System Trace(Instruments)跟踪page fault,但它是按调用堆栈组织的,很难过滤。

因此,任何工具都可以跟踪特定文件的低级别io事件?

DTrace可以做到这一点(至少在Solaris中,您必须在macOS上自己尝试(。vm提供程序具有名为fspginfspgoutfsfree的探测,当FS支持的页被分页到内存中或从内存中调出时,这些探测会分别激发,或者在未修改的情况下被释放。还有一个更通用的maj_fault,每当页面故障导致IO时就会触发

唯一的问题是,DTrace没有给你一种从这些探测中返回文件名的方法,如果你主要在一个文件上出现页面错误,这可能没问题,或者如果你试图找出哪个文件是被分页的文件,这可能真的很烦人。但是,您仍然可以获得导致页面错误的进程的execnamepid,以防有帮助。

在这里您可以看到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);
}

这打印出了每种类型故障的内存活动时间表,文档对此进行了更详细的解释。

这两个系统使用工具都依赖于Kdebug来获取它们的信息。您可以使用内置的ktrace(1((或类似kdv的第三方工具(直接监视Kdebug(如果您是root用户((http://newosxbook.com/tools/kdv.html)),其中任何一个都将获得所有的Kdebug消息,以及稍后可以使用grep(1(等应用的过滤器。如果启用了SIP,则使用Dtrace将不起作用(而且在性能方面也很痛苦(,因此Kdebug是一个不错的选择。

最新更新