如何调试网络工作者


72

我一直在与HTML 5的网络工作者一起工作,并且正在寻找调试它们的方法。理想情况下,例如萤火虫或Chrome调试器。有没有人对此有任何好的解决方案。无法访问控制台或DOM,很难调试这些代码


1
您是否尝试debugger;过在要断点的行之前添加?
Juan Mendes

嗯,重点是萤火虫和网络工具无法访问该工作人员
Zachary K

11
嗯... Chrome的Web检查器中有一个标签为“脚本”的标签;在此之下,手风琴内部有一个标有“ Worker Inspectors”的面板,上面有一个标有“ Debug”的复选框。我不确定是否可行,但是值得一试,是吗?还是您100%无法使用?
Juan Mendes

最后,我检查了它是否使用iframe模拟了一个工作程序。但是已经有一段时间了,所以他们有可能会有所改进
Zachary K

@JuanMendes,在哪里?屏幕截图。这对共享工作者有用吗?
Pacerier's

Answers:


24

作为缺少的console.log的快速解决方案,您可以使用 throw JSON.stringify({data:data})


3
当然,由于抛出异常,这将停止执行调试的位置。
jimhigson

另请参阅werker.onerror及其关联。至少很容易获得追溯。
meawoppl 2014年

56

Chrome的开发通道版本通过注入伪造的工作实现来支持工的调试,该实作使用工的客户端页面中的iframe来模拟工。您将需要导航到“脚本”窗格,然后在右侧的Workers侧边栏中选中Debug复选框,然后重新加载页面。然后,工作脚本将出现在页面脚本列表中。但是,此模拟有一定的局限性-由于工作脚本将在客户端页面线程中运行,因此工作程序中任何长时间运行的操作都将冻结浏览器UI。


Chrome 17是第一个支持Web Worker调试的版本。
Bnicholas'3

7
chrome://inspect似乎是最好的选择。它允许您打开共享工作程序运行时的控制台。
亚历克·休伊特

@AlecHewitt您如何做到的?我找不到那里列出的任何共享工作人员。
Aditya Gupta,

Firefox͏͏??
Pacerier

21

可以像正常网页一样调试WebWorker。Chrome在以下网址为WebWorkers提供了调试开发工具:chrome:// inspect /#workers

找到所需的正在运行的Webworker,然后单击“检查”。将打开一个专用于该Webworker的单独的开发工具窗口。官方说明值得检查。


最好多解释一下您的答案,否则不大可能有用或被接受。
James Woolfenden 2014年

1
谢谢詹姆斯。详细说明
user2519809

网络工作者不是上面的答案对我说的,但这对我
很有帮助

16

从Chrome 65开始,您现在可以简单地使用调试器的“逐步”功能:

在此处输入图片说明

有关更多详细信息,请参见其发行说明


Firefox͏͏??
Pacerier

哦,那真是
太好了

1
在Chrome 83.0.4103.116上无法正常工作。我多次踩入(F11)。它仅停留在呼叫者上/postMessage而不输入被呼叫者/员工代码
StephenBoesch

如果调用者功能为,async这实际上是有效的 (请注意,屏幕截图/视频未将其显示为异步..)。否则就不会
StephenBoesch

11

在chrome调试器中,在脚本选项卡中,滚动到工作面板,然后选择启动时暂停。这将允许您调试工作器并插入断点。但是您可以在其他窗口中进行所有操作


Firefox͏͏??
Pacerier

11

如在Chrome v35中

  • 加载页面并打开Chrome开发者工具。

  • 导航到“源”选项卡。

  • 选中“开始暂停”复选框,如下所示:

    在Chrome Dev Tools中调试工作人员

  • 重新加载页面,调试器将在Web Worker中暂停,尽管在新窗口中!

编辑:在较新版本的Chrome(我使用v39)中,工作程序位于“线程”选项卡下,而不是具有自己的“工作程序”选项卡(如果有正在运行的工作程序,则“线程”选项卡将变为可见)。


5
无法在chrome 38 ubuntu上找到它
Steel Brain

2
也找不到。甚至没有一个名为“工人”的子面板。
佩里耶

Firefox͏͏??
Pacerier


2

公认的答案并不是每个人的解决方案。

在这种情况下,你可以使用console.logconsole.debugconsole.error在Firefox中的Web工人。请参阅错误#620935错误#1058644

如果您使用的是Chrome浏览器,则可以像调试普通脚本一样调试网络工作者,如果这样做,console.log将打印到选项卡中。但是,如果您的工人是一个共享的工人,则可能需要看看chrome://inspect

额外提示:因为对于刚接触javascript的人员来说,Workers很难学习,所以我为他们编写了一个非常轻巧的包装器,为您提供了适用于这两种类型的Workers的一致API。称为Worker-Exchange


非常重要:这些日志不会放在页面日志中,而不会在浏览器控制台中显示(可通过ctrl + shift + j或单击Web开发人员工具图标来获得)
AUTRA 2015年

@autra,感谢您提醒我有关此答案的信息,我刚刚使用Chrome的方法进行了更新,并提到了Worker-Exchange。
Steel Brain

但是您仍然没有解释在firefox中,您应该查看浏览器控制台,而不是Web开发人员工具的常规控制台。顺便说一句,不错的API!您可能想看看github.com/gaia-components/threads,它们基本上具有相同的功能(以及其他功能),但是还添加了iframe支持。
autra 2015年

1

2016年2月,WebStorm发布了调试Web Worker的支持。

WebStorm JavaScript调试器现在可以在这些后台工作程序中达到断点。您可以像以前一样浏览框架并探索变量。在左侧的下拉列表中,您可以在工作线程和主应用程序线程之间跳转。

WebStorm Web Worker调试屏幕截图


1

一种用于调试目的而从工作程序访问消息/数据的简单解决方案是postMessage()在工作程序线程中使用,以传回所需的调试信息。

然后,这些消息可能被“捕获”在您的父进程的onmessage处理程序中,该处理程序例如可以记录从工作程序传递回控制台的消息/数据。这具有作为非阻塞方法的优点,并允许工作进程作为真实线程运行并在常规浏览器环境中进行调试。尽管这样的解决方案无法对工作进程代码进行断点级检查,但是在许多情况下,它提供了从工作进程中公开所需数据的能力,以帮助调试。

一个简单的实现可能类似于以下内容(显示了相关摘录):

//在worker的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...
   }
};

0

除了JSON.stringify()之外,还有port.postMessage( (new Object({o: object})) )。也许与它串联使用JSON.stringify会更有帮助。

希望这对您有所帮助!


0

在新版本的Google Chrome浏览器上,只需转到Deveverloper Tools> Sources(或右键单击菜单Inspect>> Sources)。

Page左面板列表的底部,您将在引擎图标中看到服务人员。

Chrome 87上的服务人员

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.