使用 V8 分析 Chromium
V8 的 CPU 和堆積分析器在 V8 的殼層中使用很簡單,但要將它們與 Chromium 搭配使用可能會讓人感到困惑。此頁面將協助您解決這個問題。
為什麼將 V8 的分析器與 Chromium 搭配使用與在 V8 殼層中使用它們不同?#
Chromium 是個複雜的應用程式,不像 V8 殼層。以下是影響分析器使用的 Chromium 功能清單
- 每個渲染器都是一個獨立的程序(好吧,其實不是每個,但我們先忽略這個細節),所以它們無法共用同一個日誌檔;
- 圍繞渲染器程序建構的沙箱會阻止它寫入磁碟;
- 開發人員工具會根據自己的目的設定分析器;
- V8 的記錄程式碼包含一些最佳化,以簡化記錄狀態檢查。
如何執行 Chromium 以取得 CPU 分析?#
以下是執行 Chromium 以從程序開始取得 CPU 分析的方法
./Chromium --no-sandbox --user-data-dir=`mktemp -d` --incognito --js-flags='--prof'
請注意,您不會在開發人員工具中看到分析,因為所有資料都記錄到檔案中,而不是開發人員工具。
旗標說明 #
--no-sandbox
關閉渲染器沙箱,讓 Chrome 可以寫入日誌檔。
--user-data-dir
用於建立新的設定檔,使用此旗標可以避免快取和已安裝擴充功能可能產生的副作用(選用)。
--incognito
用於進一步防止結果受到污染(選用)。
--js-flags
包含傳遞給 V8 的旗標
--logfile=%t.log
指定日誌檔的名稱模式。%t
會擴充為目前的毫秒數,所以每個程序都會取得自己的日誌檔。您可以使用前綴和後綴,例如:prefix-%t-suffix.log
。預設每個隔離都會取得獨立的日誌檔。--prof
指示 V8 將統計分析資訊寫入日誌檔。
Android #
Android 上的 Chrome 有許多獨特之處,讓分析變得更複雜。
- 在裝置上啟動 Chrome 之前,必須透過
adb
編寫命令列。因此,命令列中的引號有時會遺失,最好使用逗號分隔--js-flags
中的引數,而不是嘗試使用空白和引號。 - 日誌檔路徑必須指定為 Android 檔案系統中可寫入位置的絕對路徑。
- Android 上用於渲染程序的沙盒機制表示,即使使用
--no-sandbox
,渲染程序仍然無法寫入檔案系統上的檔案,因此需要傳遞--single-process
,才能在與瀏覽器程序相同的程序中執行渲染程序。 .so
嵌入在 Chrome 的 APK 中,表示符號化需要將 APK 記憶體位址轉換為建置中的未剝離.so
檔案。
下列指令可在 Android 上啟用剖析
./build/android/adb_chrome_public_command_line --no-sandbox --single-process --js-flags='--logfile=/storage/emulated/0/Download/%t.log,--prof'
<Close and relaunch Chome on the Android device>
adb pull /storage/emulated/0/Download/<logfile>
./src/v8/tools/linux-tick-processor --apk-embedded-library=out/Release/lib.unstripped/libchrome.so --preprocess <logfile>
注意事項 #
在 Windows 下,務必為 chrome.dll
開啟 .MAP
檔案建立,但不要為 chrome.exe
開啟。