有任何工具可以跟踪 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 调用(openclosewriteread)。 System Trace(Instruments)trace page fault,不过是按调用栈组织的,过滤比较困难。

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

【问题讨论】:

【参考方案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);

这会打印出每种故障类型的内存活动时间线,并且文档会更详细地解释它。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于有任何工具可以跟踪 iOS 上特定文件的页面错误和其他相关事件吗?的主要内容,如果未能解决你的问题,请参考以下文章

blktrace 只能跟踪一个特定的进程吗?

IOS App上的错误处理? [复制]

如何查明网页中任何元素的底层页面代码?

使用 PHP 跟踪文本文件中的更改

没有错误或堆栈跟踪的 iOS 崩溃

BigCommerce 主页上的 URL 参数错误