Баг с GPU и Canvas в Google Chrome под Windows

На днях работал над необычной и от того интересной задачей. Выяснилось, что у наших менеджеров на определенной странице постоянно возникает сообщение «Опаньки» в Google Chrome. Скажу сразу, страница эта весьма насыщенная, и содержит в себе достаточно тяжеловесные компоненты как фотогалерея, карта и панорама. У меня никак не получалось воспроизвести данный баг, и я собираюсь рассказать о том что было сделано для того, чтобы найти и обезвредить его.

Первым делом мы выяснили в какой последовательности нужно было действовать, чтобы получить то самое «Опаньки». А для этого нужно было зайти на нашу страницу, и затем обновить ее (либо вернуться на нее позже). Все, открытый таб Chrome под Windows моментально умирал.

Я сделал небольшой изолированный пример в JSFiddle. Откройте данную ссылку, и после того, как увидите изображение панорамы, обновите страницу. Напоминаю, у вас должен быть Windows и Google Chrome (46.0.2490.86).

Далее стало ясно, что проблема проявляется исключительно под Windows. Я работаю на Mac, но имею виртуалки IE на все случаи жизни. Но даже на виртуалке данная проблема не проявлялась вовсе. Это, кстати, очень хороший пример того, что виртуалка не всегда может полноценно заменить реальную машину с реальным железом.

Я начал гуглить, чтобы понять сталкивался ли кто-либо с такой проблемой. Но в итоге нагуглил о том, как в Google Chrome включить режим логгирования, чтобы лучше понимать, что же конкретно происходит, когда он показывает нам «Опаньку». Как это сделать?

Нужно запустить Google Chrome с флагом:

--enable-logging --v=1


И затем, после падения браузера, найти в домашней директории лог chrome_debug.log

Провернули это все на машине с Windows и стали исследовать лог:

[7924:5320:1202/135210:VERBOSE1:policy_loader_win.cc(441)] Reading policy from the registry is enabled.
[7924:5320:1202/135210:VERBOSE1:pref_proxy_config_tracker_impl.cc(216)] 03885C38: set chrome proxy config service to 00A097F8
[7924:5320:1202/135210:VERBOSE1:pref_proxy_config_tracker_impl.cc(354)] 03885C38: Done pushing proxy to UpdateProxyConfig
[7924:6044:1202/135210:VERBOSE1:multi_log_ct_verifier.cc(67)] Adding CT log: Google 'Pilot' log
[7924:6044:1202/135210:VERBOSE1:multi_log_ct_verifier.cc(67)] Adding CT log: Google 'Aviator' log
[7924:6044:1202/135210:VERBOSE1:multi_log_ct_verifier.cc(67)] Adding CT log: DigiCert Log Server
[7924:6044:1202/135210:VERBOSE1:multi_log_ct_verifier.cc(67)] Adding CT log: Google 'Rocketeer' log
[7924:6044:1202/135210:VERBOSE1:multi_log_ct_verifier.cc(67)] Adding CT log: Certly.IO log
[7924:6044:1202/135210:VERBOSE1:multi_log_ct_verifier.cc(67)] Adding CT log: Izenpe log
[7924:6044:1202/135210:VERBOSE1:multi_log_ct_verifier.cc(67)] Adding CT log: Symantec log
[7924:6044:1202/135210:ERROR:cache_util_win.cc(20)] Unable to move the cache: 5
[7924:6044:1202/135210:ERROR:cache_util.cc(132)] Unable to move cache folder C:\Users\User32\AppData\Local\Google\Chrome\User Data\ShaderCache\GPUCache to C:\Users\User32\AppData\Local\Google\Chrome\User Data\ShaderCache\old_GPUCache_000
[7924:6044:1202/135210:ERROR:cache_creator.cc(132)] Unable to create cache
[7924:6044:1202/135210:ERROR:shader_disk_cache.cc(588)] Shader Cache Creation failed: -2


Мое внимание привлекли, конечно же, последние 4 строчки. Видно, что по каким-то неведомым причинам браузер не смог скопировать директорию GPUCache. Не могу сказать, что точно знаю как Chrome работает с GPU и с его кешем, но что-то последнее время сочетание Windows и GPU начало набивать оскомину.

Дальше попеременным отключением карты и панорамы удалось установить, что причина была именно в Street View. Создал по этому поводу Issue в Chromium.

Вместо итога


Как видно из созданного мною тикета, проблема была исправлена в стабильной версии 47, до которой Chrome уже обновился. Но так или иначе я решил-таки написать этот пост, который вполне может быть полезным для разработчиков хотя бы с точки зрения подхода к решению проблемы. Я соглашусь с теми, кто скажет, что решить проблему попеременным отключением компонентов можно было. В общем-то так и произошло, но выяснить является ли проблема ошибкой программиста или это баг определенной экосистемы — тоже немаловажно с точки зрения дальнейшей поддержки этого же компонента.

© Habrahabr.ru