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

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

Ответ 1

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

Ответ 2

Dev Channel версия Chrome поддерживает отладку рабочих, введя реализацию поддельных рабочих, которая имитирует работников, использующих iframe на странице рабочего клиента. Вам нужно будет перейти на панель "Сценарии" и поставить галочку "Отладка" на боковой панели "Рабочие" справа, а затем перезагрузить страницу. Затем рабочий script появится в списке скриптов страниц. Это симуляция имеет определенные ограничения, хотя, поскольку рабочий script будет запущен в потоке клиентской страницы, любые длительные операции в рабочем режиме заморозят пользовательский интерфейс браузера.

Ответ 3

в хром-отладчике на вкладке script выделите рабочую панель и выберите паузу при запуске. Это позволит вам отлаживать рабочего и вставлять точки останова.. но вы делаете все это в другое окно

Ответ 4

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

Найдите желаемого веб-исполнителя и нажмите "проверить". Откроется отдельное окно разработчика, посвященное этому веб-инструменту. Официальные [инструкции] [2] заслуживают проверки.

Ответ 5

Как и в Chrome v35

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

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

  • Установите флажок Check Pause of Start, как показано ниже:

    Debugging workers in Chrome Dev Tools

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

Изменить: в новых версиях Chrome (я использую v39) рабочие находятся на вкладке "Темы", вместо того, чтобы иметь собственную вкладку "Рабочие" (вкладка "Темы" станет видимой, если есть работающие рабочие).

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

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

Ответ 9

В феврале 2016 года WebStorm выпустила поддержку отладки веб-работников.

Отладчик JavaScript WebStorm теперь может ударять точки останова внутри этих фоновых работников. Вы можете пройти через кадры и исследовать переменные так же, как вы использовали. В раскрывающемся списке слева вы можете перемещаться между рабочими потоками и основным потоком приложения.

Веб-исполнитель отлаживает снимок экрана</a

Ответ 10

Простым решением для получения доступа к сообщениям/данным от рабочего для целей отладки является использование 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...
   }
};