使用 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 启用。