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

时间:2018-11-01 11:51:25

标签: ios instruments darwin dtrace xnu

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

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

2 个答案:

答案 0 :(得分:1)

DTrace可以执行某些操作(至少在Solaris中,您必须在macOS上尝试一下)。 vm提供程序具有名为fspginfspgoutfsfree的探针,当FS支持的页面被调入或调出内存或在未修改的情况下被释放时,它们将触发, 分别。还有一种更通用的名称为maj_fault,它在页面错误导致IO时触发。

唯一的问题是DTrace不能为您提供从这些探针返回文件名的方法,如果您主要是在单个文件上出现页面错误,那么这可能没问题,或者如果您这样做,可能真的很烦人。重新尝试找出要分页的文件。但是,在有帮助的情况下,您仍然可以获取导致页面错误的过程的execnamepid

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);
}

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

答案 1 :(得分:0)

这两个系统使用工具都依靠Kdebug来获取其信息。您可以使用内置的ktrace(1)(或第三方工具,如kdv(http://newosxbook.com/tools/kdv.html))直接监视Kdebug(如果您是root用户),这两种方法都会为您提供所有的Kdebug消息,您可以稍后使用grep(1)等应用的过滤器。如果启用了SIP,则无法使用Dtrace(并且在性能方面也很痛苦)-因此Kdebug是一个不错的选择。