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

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

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

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

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

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

1
--enable-logging --v=1

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[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.

Вместо итога

Целью написания данного миниисследование является показать сообществу, что такой баг существует, и, возможно, сэкономить время. Решить проблему в моем случае можно было бы перебором отключения компонентов, но хотелось понять в чем конкретно проблема. И исследуя ее, удалось заодно узнать много нового.

Если у вас данная проблема воспроизводится, то, пожалуйста, присоединяйтесь и оставляйте свои комменты на ISSUE трекере.

Полезные ссылки

Как включить логгирование в Google Chrome
Issue на эту тему в Chromium

UPDATE Проблема была исправлена с выходом версии 47.