取样进程
又称:给App取样、进程取样
简要回答
“取样进程”是活动监视器中的一个工具,会在几秒钟内记录所选进程在做什么,并生成一份文本报告,说明它的线程把时间花在了哪里。开发者用这些报告找出App为什么变慢、忙碌或挂起。
Apple的说明是,“取样进程”会为所选进程生成一份为期3秒的报告。报告列出每个线程及其正在运行的函数,并用次数显示每个函数出现的频率。
你不需要自己看懂这份报告。当某个App卡住或占用大量CPU,而你想给开发者提供一些具体信息时,它最有用。
如何在活动监视器中对进程取样
选择该进程,然后点按窗口顶部的“更多”按钮(三个点),选取“取样进程”。你也可以连按该进程,在打开的窗口中点按“取样”。
报告出现后,你可以把它存储为文本文件,附在错误报告或支持请求中。
如何在“终端”中对进程取样
运行sample <PID> 5对一个进程取样5秒。你可以用进程名称的一部分代替PID。报告会被打印出来并存储到文件中,完成时会显示文件路径。
如何看懂取样报告
报告开头是一段标题信息:进程名称和PID、路径、父进程、代码类型以及macOS版本。关键部分紧随其后,在Call graph下面。
Call graph会列出每个线程。主线程,也就是处理点按和按键的那个线程,标为com.apple.main-thread。每个线程下面,函数用缩进表示谁调用了谁。每行开头的数字,是取样时该函数出现在调用栈上的次数。
- 顺着数字最大的那些行一直往下,找到缩进最深处。线程大部分时间就花在那里。
- 如果主线程最深处的几行是
mach_msg、__psynch_cvwait或__semwait_signal这类等待调用,说明线程被阻塞,在等别的东西。 - 如果最深处的几行是App自己的函数,而且次数很大,说明线程正忙着干活。
- 靠近末尾的“Sort by top of stack”部分列出了最常在运行的函数,是同一份数据的快速摘要。
- 末尾的Binary Images列表列出了进程中载入的框架和库。
如何在“终端”中把取样存储为文件
sample命令比活动监视器可控性更强。它默认取样10秒,时长可以更改。
- 从“应用程序”>“实用工具”中打开“终端”。
- 用
pgrep -lx Safari找到进程ID,把Safari换成进程名称。 - 在问题发生时运行
sample <PID> 10 -file ~/Desktop/sample.txt。 - 打开桌面上的文件,或把它附在错误报告中。
取样什么时候有用,什么时候没用
取样是某一个进程的快照。在你已经知道是哪个App出问题时使用它。
- 有用:某个App卡死、某个进程的“% CPU”一直很高,或者某个App在一项可重复的操作上很慢。
- 用处不大:整台Mac都很慢,而你不知道原因。这种情况更适合用覆盖所有进程的spindump。
- 没用:问题已经过去了。取样只能显示它运行期间发生的事。
如何把取样发给开发者
单独一份取样就有用,但附上一段简短说明,开发者处理起来会容易得多。
- 在App卡死或忙碌时取样,而不是等它恢复之后。
- 把报告存储为文本文件,而不是只复制其中一部分。开发者需要完整的Call graph和Binary Images列表。
- 写下问题开始时你在做什么,比如打开了哪个文件、点按了哪个按钮。
- 注明App的版本和你的macOS版本。报告标题信息中的Version和OS Version也会列出这两项。
- 通过App的支持页面或错误跟踪系统发送;如果是Apple的App,就通过“反馈助理”发给Apple。
常见问题
活动监视器中的“取样进程”有什么用?
它会记录一个进程大约3秒内在做什么,并显示一份报告,列出它的线程以及这些线程正在运行的代码。开发者用它来诊断挂起和CPU占用过高的问题。
对进程取样安全吗?
安全。取样只是观察这个进程,不会改变或停止它。
什么时候应该对进程取样?
在问题发生时取样,比如App卡死或占用大量CPU的时候。等它恢复后再取样,就看不出原因了。
“取样进程”需要多长时间?
在活动监视器中,它记录大约3秒。“终端”中的sample命令默认记录10秒,也可以按你指定的秒数记录。
取样报告里有个人信息吗?
它包含进程名称、文件路径和载入的库,而路径中可能包含你的用户名。在任何公开场合发布之前,先读一遍。
为什么取样里显示的是问号而不是函数名?
App的那些部分没有可用的符号名称。开发者仍然可以把地址对应到自己的代码上,所以原样发送报告即可。
相关条目
想找比活动监视器更好的工具?请看Mac上最好用的活动监视器替代品,或者浏览术语表中的所有条目。