取樣程序
又稱:為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上最好用的活動監視器替代方案,或瀏覽詞彙表中的所有詞條。