Профилирование Chromium с использованием V8
Профайлеры процессора и памяти V8 легко использовать с оболочками V8, но может быть неочевидно, как использовать их с Chromium. Эта страница поможет вам в этом.
Почему использование профайлеров V8 с Chromium отличается от их использования с оболочками V8?
Chromium — сложное приложение, в отличие от оболочек V8. Ниже перечислены особенности Chromium, которые влияют на использование профайлеров:
- каждый рендерер является отдельным процессом (ну ладно, не каждый, но опустим эту деталь), поэтому они не могут использовать общий файл логов;
- песочница, построенная вокруг процесса рендерера, не позволяет ему записывать данные на диск;
- инструменты разработчика настраивают профайлеры для своих собственных целей;
- код логирования V8 содержит некоторые оптимизации, упрощающие проверку состояния логирования.
Как запустить Chromium, чтобы получить профилирование процессора?
Вот как запустить Chromium, чтобы получить профилирование процессора с начала процесса:
./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
Chrome на Android имеет ряд уникальных моментов, усложняющих процесс профилирования.
- Командная строка должна быть записана через
adb
перед запуском Chrome на устройстве. В результате кавычки в командной строке иногда теряются, поэтому лучше разделять аргументы в--js-flags
запятыми, а не пробелами и кавычками. - Путь к файлу логов должен быть указан как абсолютный путь к доступному для записи месту на файловой системе Android.
- Песочница, используемая для процессов рендеринга на Android, означает, что даже с
--no-sandbox
процесс рендеринга не может записывать файлы на файловую систему, следовательно, необходимо задать--single-process
, чтобы выполнить процесс рендеринга в том же процессе, что и процесс браузера. .so
встроена в APK Chrome, что означает необходимость преобразования адресов памяти из APK в файле.so
, который не был обрезан, в сборках.
Следующие команды включают профилирование на Android:
./build/android/adb_chrome_public_command_line --no-sandbox --single-process --js-flags='--logfile=/storage/emulated/0/Download/%t.log,--prof'
<Закройте и перезапустите Chrome на устройстве Android>
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 обязательно включите создание файлов .MAP
для chrome.dll
, но не для chrome.exe
.