使用 V8 分析 Chromium

本文档介绍了如何在 Chromium 中使用 V8 的 CPU 和堆分析器。

从 V8 的 shell 程序中使用 V8 的 CPU 和 堆分析器很简单,但是如何将它们与 Chromium 一起使用可能会感到困惑。此页面可以给你提供帮助。

为什么在 Chromium 中使用 V8 分析器与在 V8 shell 中使用它们不同? { #why-is-using-v8’s-profilers-with-chromium-different-from-using-them-with-v8-shells? }

与 V8 shell 不同,Chromium 是一个复杂的应用程序。以下是影响分析器使用的 Chromium 功能列表:

  • 每个渲染器都是一个单独的进程(好的,实际上不是每个渲染器,但我们省略此细节),因此它们不能共享相同的日志文件;
  • 为渲染器进程构建的沙盒可防止其写入磁盘;
  • 开发者工具出于自己的目的配置了分析器;
  • V8 的日志记录代码包含一些优化,以简化日志记录状态检查。

如何运行 Chromium 获取 CPU 分析日志? { #how-to-run-chromium-to-get-a-cpu-profile? }

以下是运行 Chromium 的方法,以便从进程开始时获取 CPU 分析日志:

  1. ./Chromium --no-sandbox --user-data-dir=`mktemp -d` --incognito --js-flags='--prof'

请注意,你不会在开发者工具中看到分析记录,因为所有数据都已记录到文件中,而不是开发者工具中。

标志说明 { #flags-description }

--no-sandbox 关闭渲染器沙盒,以便 chrome 可以写入日志文件。

--user-data-dir 用于创建一个新的分析记录,用它来避免已安装扩展的缓存和潜在的副作用(可选)。

--incognito 用于进一步防止结果受影响(可选)。

--js-flags 包含传递给 V8 的标志:

  • --logfile=%t.log 指定日志文件的名称模式。%t 以毫秒为单位扩展到当前时间,因此每个进程都有自己的日志文件。你可以根据需要使用前缀和后缀,例如:prefix-%t-suffix.log。默认情况下,每个 isolate 都会获取一个单独的日志文件。
  • --prof 告诉 V8 将统计分析信息写入日志文件。

Android { #android }

Android 上的 Chrome 浏览器具有许多独特之处,这使其分析起来更加复杂。

  • 在设备上启动 Chrome 之前,必须通过 adb 编写命令行。结果,命令行中的引号有时会丢失,并且最好用逗号分隔 --js-flags 中的参数,而不要尝试使用空格和引号。
  • 日志文件的路径必须指定为 Android 文件系统上可写位置的绝对路径。
  • Android 上用于渲染器进程的沙盒意味着即使使用 --no-sandbox,渲染器进程仍无法写入文件系统上的文件,因此,需要传递 --single-process 才能在与浏览器进程相同的进程中运行渲染器 。
  • .so 嵌入在 Chrome 的 APK 中,这意味着符号化需要从 APK 内存地址转换为构建中未剥离的 .so 文件。

以下命令可在 Android 上启用性能分析:

  1. ./build/android/adb_chrome_public_command_line --no-sandbox --single-process --js-flags='--logfile=/storage/emulated/0/Download/%t.log,--prof'
  2. <Close and relaunch Chome on the Android device>
  3. adb pull /storage/emulated/0/Download/<logfile>
  4. ./src/v8/tools/linux-tick-processor --apk-embedded-library=out/Release/lib.unstripped/libchrome.so --preprocess <logfile>

注意 { #notes }

在 Windows 下,请确保为 chrome.dll 打开 .MAP 文件创建功能,而不是为 chrome.exe