在 Safari Web 检查器中调试 Web Worker

Debugging Web Workers in Safari Web Inspector

提问人:Daniel A. White 提问时间:6/5/2015 更新时间:11/30/2016 访问量:5355

问:

Chrome 的开发工具非常适合调试 Web Worker,因为我可以“浏览”到 JavaScript 环境并设置断点。甚至控制台也能按预期工作。

在Safari上,这是一个完全不同的故事。 From the Web Worker 甚至不会在控制台中打印。我看到加载了工作脚本,并在其上放置了一个断点,但它没有中断。我什至没有看到加载了 .console.logimportScripts

如何使用 Safari 的 Web 检查器对问题进行故障排除?

并不是说我认为这很重要,但我正在使用 Safari 8。

JavaScript 调试 Safari Web-Worker

评论

1赞 Halcyon 6/5/2015
您需要使用 Safari 是有原因的吗?您是否正在调查 Safari 特定问题?
2赞 Daniel A. White 6/5/2015
我公司的产品支持 Safari(以及所有主流浏览器),我们希望让客户和支持工程师能够解决问题,无论使用哪种 Web 浏览器。
3赞 muttonUp 7/18/2015
Chrome、FireFox、Opera、IE、Edge;所有这些都在控制台中显示来自 Web Worker 的消息。野生动物园?“哈!我们更清楚,你不需要那个......”
0赞 Kyaw Tun 9/15/2016
所有浏览器看起来都很好,只有Safari有问题,这就是为什么需要在Safari中专门调试的原因。
0赞 Daniel A. White 9/15/2016
@KyawTun阅读我上面的评论

答:

-3赞 singmotor 10/7/2016 #1

您可以使用 postMessage 代替 console.log。postMessage 应该允许您向 Safari 控制台发送调试消息。

这是一个关于如何做到这一点的很好的例子,我在下面粘贴了主要思想:

//
// In the Main thread
//
var worker = new Worker('/path/of/webworker/code.js')
worker.onmessage = function (e) {
  var result = JSON.parse(e.data);
  if(result.type == 'debug') {
    console.log(result.msg);
  } else if(result.type == 'response') {
    // ... use result.answer ...
  }
}


//
// In the WebWorker
//
function debug(msg) {                                                           
  postMessage(JSON.stringify({type:'debug',msg:msg}));                          
}

onmessage = function (e) {
  var inputData = e.data;
  // work on input data
  debug('Working OK');
  // work some more
  // ...
  postMessage(JSON.stringify({type:'response', answer:42}));
};

如果你不想玩postMessage,David Flanagan在这里为它做了一个包装器,它应该允许你至少使用console.log进行调试

评论

2赞 Daniel A. White 10/7/2016
我确实知道,但是我真的很想设置断点并拥有完整的调试体验。postMessage
-1赞 Chrome App 11/14/2016 #2

在源代码中插入代码debugger;

用法:将其插入到要添加断点的任何位置,当开发人员控制台自动打开时,执行将在该行暂停

var a = 50;
a = a + 5;
debugger; //--> execution is paused here
a = a - 5;

有关详细信息,请参阅有关 mozilla.org 的调试器文档

评论

1赞 Samuel Liew 11/14/2016
将来请为您的链接提供描述性名称或标题。
0赞 Chrome App 11/30/2016
@Daniel A. White ,嗨,这对你有用吗??如果是,你能为这篇文章投赞成票吗??
0赞 user3761308 10/18/2017
在 Safari 中不执行任何操作 (<= 9.1)
0赞 Serge 11/18/2020
你并不总是控制所有的源代码......在某些情况下,我不能使用调试器语句。我只是不明白为什么苹果不能做到这一点......在 Chrome 中工作正常......但是我被困在一个IOS包装器项目中......