Как отлаживать веб-воркеры

Я работаю с веб-работниками в HTML 5 и ищу способы их отладки. В идеале что-то вроде отладчиков firebug или chrome. У кого-нибудь есть хорошее решение для этого. без доступа к консоли или DOM трудно отлаживать сомнительный код


person Zachary K    schedule 24.02.2010    source источник
comment
Пробовали ли вы добавить debugger; перед строкой, на которую хотите поставить точку останова?   -  person Juan Mendes    schedule 17.11.2011
comment
Гм, все дело в том, что firebug и веб-инструменты не могут получить доступ к рабочему   -  person Zachary K    schedule 17.11.2011
comment
Гм ... В веб-инспекторе Chrome есть вкладка с надписью «Сценарии»; под ним есть панель внутри аккордеона с надписью «Инспекторы рабочих» с флажком «Отладка». Я не уверен, что это работает, но стоит попробовать, не так ли? Или вы на 100% уверены, что это не сработает?   -  person Juan Mendes    schedule 17.11.2011
comment
В последний раз я проверял, что он имитировал рабочего с помощью iframe. Но это было давно, так что, возможно, они что-то улучшили.   -  person Zachary K    schedule 19.11.2011
comment
@JuanMendes, где? снимок экрана. Это работает для общих работников?   -  person Pacerier    schedule 08.09.2017
comment
@Pacerier Это изменилось с момента комментария, попробуйте перейти к chrome://inspect/#workers   -  person Juan Mendes    schedule 09.09.2017
comment
Я надеюсь, что за последние 7 лет ситуация улучшилась!   -  person Zachary K    schedule 18.09.2017


Ответы (12)


В качестве быстрого решения отсутствующего console.log вы можете просто использовать throw JSON.stringify({data:data})

person daralthus    schedule 13.02.2011
comment
Конечно, это остановит выполнение там, где вы выполняете отладку из-за броска. - person jimhigson; 19.03.2014
comment
См. также werker.onerror и связанные с ним ошибки. По крайней мере, это позволяет довольно легко получить трассировку. - person meawoppl; 26.05.2014

Версия Chrome для Dev Channel поддерживает отладку рабочих процессов путем внедрения поддельной реализации рабочих процессов, которая имитирует рабочие процессы с использованием iframe на странице клиента рабочего процесса. Вам нужно будет перейти на панель «Сценарии» и установить флажок «Отладка» на боковой панели «Рабочие» справа, а затем перезагрузить страницу. После этого рабочий скрипт появится в списке скриптов страниц. Однако эта симуляция имеет определенные ограничения: поскольку рабочий скрипт будет выполняться в потоке клиентской страницы, любые длительные операции в рабочем потоке зависают в пользовательском интерфейсе браузера.

person caseq    schedule 28.04.2010
comment
Chrome 17 был первой версией, поддерживающей отладку веб-воркеров. - person Bnicholas; 01.03.2012
comment
Идти в chrome://inspect кажется лучшим вариантом. Это позволяет вам открыть консоль во время выполнения общего воркера. - person Alec Hewitt; 23.11.2015
comment
@AlecHewitt Как ты это делаешь? Я не могу найти никаких общих рабочих, перечисленных там. - person YetAnotherBot; 02.05.2019
comment
Firefox͏͏?? - person Pacerier; 07.06.2020

WebWorker можно отлаживать так же, как обычную веб-страницу. Chrome предоставляет средства отладки для WebWorkers по адресу: chrome://inspect/#workers.

Найдите нужный работающий веб-воркер и нажмите «Проверить». Откроется отдельное окно инструмента разработки, посвященное этому веб-воркеру. Стоит ознакомиться с официальными инструкциями.

person user2519809    schedule 22.10.2014
comment
Было бы неплохо объяснить свой ответ подробнее, иначе у вас мало шансов, что он будет полезен или принят. - person James Woolfenden; 22.10.2014
comment
Спасибо, Джеймс. Проработанный - person user2519809; 23.10.2014
comment
Веб-работники не были там, где для меня говорят приведенные выше ответы, но это сработало, спасибо - person jamylak; 07.09.2015

Начиная с Chrome 65, теперь вы можете просто использовать функцию «входа» отладчика:

введите описание изображения здесь

Дополнительные сведения см. в их примечаниях к выпуску.

person Philipp Claßen    schedule 16.02.2018
comment
Он не работает на хроме 83.0.4103.116. Я много раз нажимал шаг (F11). он просто остается на звонилке/postMessage но не входит в код звонилки/воркера - person WestCoastProjects; 10.07.2020
comment
На самом деле это работает, если вызывающая функция async (обратите внимание, что скриншот/видео не показывает его как асинхронный ..) . В противном случае это не - person WestCoastProjects; 10.07.2020

в отладчике Chrome на вкладке сценария прокрутите до рабочей панели и выберите паузу при запуске.. это позволит вам отлаживать рабочего и вставлять точки останова.. но вы делаете все это в другом окне

person zeacuss    schedule 08.04.2012
comment
Firefox͏͏?? - person Pacerier; 07.06.2020

Как в Chrome v35

  • Загрузите свою страницу и откройте Инструменты разработчика Chrome.

  • Перейдите на вкладку Источники.

  • Установите флажок Пауза при запуске, как показано ниже:

    Отладка рабочих процессов в  Инструменты разработчика Chrome

  • Перезагрузите страницу, отладчик приостановится в веб-воркере, правда, в новом окне!

Редактировать: в более новых версиях Chrome (я использую v39) рабочие процессы находятся на вкладке «Потоки» вместо собственной вкладки «Рабочие» (вкладка «Потоки» станет видимой, если есть какие-либо работающие рабочие процессы).

person Ashwin Aggarwal    schedule 13.06.2014
comment
не могу найти на chrome 38 ubuntu - person Steel Brain; 15.10.2014
comment
Тоже не получается найти. Нет даже подпанели Workers. - person Pacerier; 18.08.2016
comment
Firefox͏͏?? - person Pacerier; 07.06.2020

Вы можете использовать self.console.log('your debugging message')

person Harshit Jain    schedule 23.04.2014

Принятый ответ на самом деле не является решением для всех.

В этом случае вы можете использовать console.log или console.debug или console.error в Web Workers в Firefox. См. Ошибка №620935 и Ошибка №1058644.

и если вы используете Chrome, вы можете отлаживать веб-воркеры так же, как отлаживаете обычные скрипты, console.log будет напечатан на вашей вкладке, если вы это сделаете. Но если ваш воркер является общим, вы можете взглянуть на chrome://inspect.

Дополнительный совет: поскольку людям, плохо знакомым с javascript, довольно сложно освоить Workers, я написал для них чрезвычайно легкую оболочку, которая предоставляет вам согласованный API для обоих типов Workers. Он называется Worker-Exchange.

person Steel Brain    schedule 07.01.2015
comment
Очень важно: эти журналы не будут отображаться в журнале страницы, НО в консоли браузера (доступно с помощью ctrl+shift+j или щелчком по значку инструментов веб-разработчика) - person autra; 07.05.2015
comment
@autra, спасибо, что напомнили мне об этом ответе, я только что обновил метод Chrome и упомянул Worker-Exchange. - person Steel Brain; 07.05.2015
comment
Но вы так и не объясняете, что в фаерфоксе надо смотреть на Консоль браузера, а не на обычную консоль инструментов веб-разработчика. Кстати, хороший API! Вы можете взглянуть на github.com/gaia-components/threads, который в основном то же самое (среди прочего), но также добавляет поддержку iframe. - person autra; 12.05.2015

Простое решение для получения доступа к сообщениям/данным от рабочего потока в целях отладки — использовать postMessage() из вашего рабочего потока для передачи нужной отладочной информации.

Эти сообщения затем могут быть «пойманы» в обработчике onmessage вашего родительского процесса, который может, например, регистрировать сообщения/данные, переданные обратно от работника на консоль. Преимущество такого подхода в том, что он неблокирует и позволяет рабочим процессам работать как настоящие потоки и отлаживаться в обычной среде браузера. Хотя подобное решение не позволяет проверять код рабочего процесса на уровне точки останова, во многих ситуациях оно предлагает возможность предоставлять столько данных, сколько необходимо, из рабочего процесса для облегчения отладки.

Простая реализация может выглядеть следующим образом (показаны соответствующие выдержки):

// Где-то в области действия рабочей функции onmessage (используйте столько раз, сколько необходимо):

postMessage({debug:{message:"This is a debug message"}});

// В родительском обработчике onmessage:

myWorker.onmessage = function(event) {
   if(event.data && event.data.debug) {
      // handle debug message processing here...
      if(event.data.debug.message) {
         console.log("message from worker: %o", event.data.debug.message);
      }
   } else {
      // handle regular message processing here...
   }
};
person bluebinary    schedule 16.09.2016

Помимо JSON.stringify() есть еще port.postMessage( (new Object({o: object})) ). Возможно, использование его в тандеме с JSON.stringify будет более полезным.

Надеюсь, это было полезно!

person Cody    schedule 18.07.2013


В новых версиях Google Chrome просто выберите Deveverloper ToolsSources (или меню правой кнопки мыши › InspectSources).

В нижней части Page списка левой панели вы увидите сервис-воркеров в значке движка.

Service Workers в Chrome 87

person I.G. Pascual    schedule 02.12.2020