使用 V8 分析 Chromium
V8 的 CPU 和堆分析器 在 V8 的 shell 中使用起来非常简单,但使用它们分析 Chromium 可能会让人感到困惑。本页将帮助您解决这个问题。
为什么使用 V8 的分析器分析 Chromium 与使用它们分析 V8 shell 不同? #
Chromium 是一个复杂的应用程序,与 V8 shell 不同。以下是影响分析器使用方式的 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 有许多独特的点,使得分析它变得更加复杂。
- 命令行必须通过
adb
在设备上启动 Chrome 之前写入。因此,命令行中的引号有时会丢失,最好使用逗号而不是空格和引号来分隔--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
启用。