为什么我的调试器在视觉上以错误的方式停止?

hen*_*enk 17 debugging google-chrome webstorm meteor

我在用

METEOR@1.4.4.2
WebStorm@2017.1.1 
Chrome@58.0.3029.110 (64-bit)
macOS Sierra 10.12.5
ecmascript@0.7.3
ecmascript-runtime@0.3.15
Run Code Online (Sandbox Code Playgroud)

最近,调试器开始在错误的线路上停止,但只是在视觉上,大多数情况下它就像实际断点后面的8-14行.

例如

*橙色条表示谷歌浏览器中的断点

控制台输出:

在此输入图像描述

另外,正如您所看到的,某些行变暗,这意味着我无法在浏览器中设置断点.

WebStorm内部调试器中的行为是相同的.所以我认为这不是Chrome的错.看起来源映射已被破坏.我不知道是WebStorm,还是Meteor.在这种情况下,调试非常困难......

Mas*_*rAM 10

很难说是肯定的,但是您遇到的问题似乎与导致Meteor生成错误源映射的错误有关.

源地图

这不是浏览器的"错误".它只显示项目中源映射传递给它的代码和位置.

app.js文件和源地图(app.js.map)由流星生成过程生成并从供应.meteor/local/build/programs/web.browser/app目录.

.map文件负责告诉浏览器如何显示原始源,以及生成的app.js文件中的哪些段映射到原始源代码中的哪些段.

关于源地图的技术方面的一个很好的解释可以在这里找到.

您可以在线查看源地图,并查看使用此工具的地图(选择custom...并拖放两者.js.map文件.

疑似虫子

作为构建过程的一部分,Meteor使用babel-compilerMeteor软件包.在某些时候,一个错误导致在babel转换后产生无效映射.

该错误目前在GitHub上进行跟踪,而Meteor人员似乎正在关注该问题.

你能做什么?

目前,没有快速简便的解决方案.

你可以:

  • 观察bug线程并等待它现在解决和调试,而不使用源映射(如果bug很快就会修复,可能是最好的).
  • 使用相关Meteor软件包的本地克隆(可以工作,我没有深入研究依赖性问题,并没有真正推荐它,但这是一种方法).
  • 从已知良好状态的git checkout运行Meteor,直到修复程序被释放.

最后一个选项是@hwilson为了开始通过a找到错误而做的git bisect.

您可以参考Meteor开发人员文档,了解有关从结帐运行流星工具的方法的详细信息,但事项的要点如下:

首先,确保您的代码(包括.meteor/versions和代码.meteor/packages已经签出到源代码管理中),因为您可能需要暂时将它们搞砸,并且一旦修复了错误就会想要恢复它们.

  1. git clone --recursive https://github.com/meteor/meteor.git到你选择的目录(例如,/home/yourname/src/remote.
  2. cd meteor.
  3. git checkout 25a89b5 获得最后一次已知的良好提交.
  4. git submodule update --init --recursive 结账后确保一切都还是黄金.
  5. ./meteor --help 签出版本开始
  6. 在您的项目中,从.meteor/packages文件中删除版本信息,因为它们可能与您的结帐提供的版本信息不兼容.
  7. 在您的项目目录中,运行/home/yourname/src/remote/meteor/meteor run.

这将运行检出的Meteor版本.您可能需要执行meteor reset(警告:这会清除本地mongo数据库)或至少清理一些.meteor/local(例如,源映射)以使其工作,但这可能是不必要的.

对于我认为将在不久的将来解决的错误,这是相当多的努力,但我决定部分包含此信息,以便用作未来源图相关问题的文档.