术语表/出问题的时候

Spindump

又称:挂起报告

简要回答

spindump是一份诊断报告,记录Mac上各个进程当时在做什么,用来调查挂起或停止响应的App。macOS自带spindump工具,活动监视器也可以从“更多”菜单中生成一份。

spindump就像是对整个系统而不是单个进程的一次取样。它会显示哪些线程在运行、哪些在等待,帮助开发者看清App为什么停止响应。

Apple对活动监视器中Spindump的说明是:为通过强制退出结束的无响应App生成报告。它是“更多”菜单中的几种诊断报告之一,另外还有“取样进程”和“系统诊断”。

如何在活动监视器中生成spindump

点按活动监视器窗口顶部的“更多”按钮(三个点),选取“运行Spindump”。系统可能会要求你输入管理员密码。完成后报告会打开,你可以存储它。

要在App挂起时生成,而不是之后,这样报告才能记录下问题。

拿到spindump之后怎么办

把它附在错误报告中,发给该App的开发者,或者通过“反馈助理”发给Apple。报告中可能包含你正在运行的App和进程的名称,所以公开分享前先检查一遍。

如何在“终端”中生成spindump

spindump命令会对Mac上的每个进程取样,所以必须以root身份运行。它只记录各进程在做什么,不会停止它们。

  1. 趁App仍然挂起时打开“终端”。
  2. 运行sudo spindump Safari -reveal,把Safari换成App名称的一部分。系统要求时,输入你的管理员密码。
  3. 等它取样完成。默认时长为10秒。
  4. 完成后,报告会存储在/tmp中,-reveal选项会在访达中显示它。

如何看懂spindump

你指定的App排在最前面,其他所有进程紧随其后。每个进程都会显示它的线程,以及取样期间看到的调用栈。

  • 默认情况下,调用栈按次数排序。以84开头的一行,表示在84次取样中都出现了。
  • 帧开头的星号(*)表示内核代码。
  • 每个调用栈最深处的帧会显示该线程当时是在运行还是被挂起。
  • 如果App的主线程被挂起、在等待另一个进程,就在同一份报告里查看那个进程。这正是它比单个进程取样强的地方。

spindump存储在哪里

当你强制退出一个无响应的App时,macOS可以自动生成一份报告,并可能提出把它发送给Apple。这些报告存储在/Library/Logs/DiagnosticReports中。

你可以在“应用程序”>“实用工具”中的“控制台”App里浏览它们。在边栏的“报告”下,查看“旋转报告”和“诊断报告”。选择一份报告即可阅读。

你自己从活动监视器生成的报告,完成后会在一个窗口中打开。关闭窗口之前先从中存储报告,这样你就有一份副本可以发送。

取样、spindump还是系统诊断

活动监视器的“更多”菜单提供了几种报告。选择与问题相符的那一种。spindump比取样大得多,因为它包含每个进程;系统诊断耗时更长,运行前还会显示隐私提示。如果开发者要的是取样,就发送取样。如果Apple支持要求提供某种特定报告,就发送那一种。

  • 取样进程:一个进程,大约3秒。在你知道是哪个App卡住或忙碌时使用。
  • Spindump:Mac上的所有进程。在App挂起、而原因可能出在另一个进程时使用。
  • 系统诊断:一份更大的报告,根据整台Mac的日志生成,通常是Apple支持要求提供的。

常见问题

Mac上的spindump是什么?

它是一份记录各个进程当时在做什么的诊断报告,用来找出App挂起的原因。你可以从活动监视器的“更多”菜单中生成。

spindump和取样有什么区别?

“取样进程”只记录所选的一个进程。spindump会查看整个系统中的进程,当挂起的原因不在App本身时更有帮助。

spindump占用大量CPU正常吗?

它在写报告时可能会短暂占用CPU,这通常发生在某个App挂起之后。报告完成后,它应该会自己停下来。

为什么spindump需要管理员密码?

它会读取Mac上每个进程的调用栈,包括系统进程。macOS只允许root这样做。

没有东西卡死时,也能生成spindump吗?

能,但它只会显示正常的活动。要在App挂起时生成,报告才能记录下问题。

为什么强制退出App后出现了一份spindump?

macOS会用spindump记录无响应的App在被强制退出时正在做什么。“发送给Apple”对话框要提交的就是这份报告。

相关条目

想找比活动监视器更好的工具?请看Mac上最好用的活动监视器替代品,或者浏览术语表中的所有条目。