closures时使用require时,不能在函数内部设置断点

使用节点检查器,我无法在下面的node.js代码中设置断点。 ( main.js内容)

 (function() { require('underscore'); var doSomething = function(callback) { callback('doSomething Finished'); } doSomething(function(x) { console.log(x); }); }).call(this); 

我可以很容易地在第2行,第4行或第8行设置一个断点,但是无论我多么努力地尝试debugging器,都不会让我在第5行或第9行设置一个断点。要清楚,我正在使用以下命令运行node-inspector

 node --debug-brk main.js node-inspector 

我也尝试在networking风暴中debugging,但问题依然存在。 如果我删除行require('underscore'); ,那么问题立即消失,我可以在function体内再次设置断点。 如果我删除最外层的闭包函数,问题也会消失。 看来require和文件级别closures之间的交互作用正在破坏节点debuggingfunction。 有没有人自己经历过这个问题,并且/或者知道任何可以打破函数体内部的变通方法?

编辑:我的节点js版本

 Tony:~ $ node --version v0.10.12 Tony:~ $ 

这可能不是你想听到的答案,因为它不能解释为什么你不能设置任何断点,但是我只是简单地从闭包中移除你的require语句并把它放在顶层。 我会更进一步,并build议你不要使用像上面那样的封闭。

原因是节点使用自己的模块系统,而不像浏览器中的Javascript,声明variables顶层不会污染全局名称空间。 这就是要求(…)进来的地方。所以,通过将你的代码包装在一个立即调用的函数中(当然,除非你希望你的模块能够同时运行客户端和服务器端)。

我猜测你无法设置任何断点的原因是V8运行时正在识别一个不必要的闭包,然后为你优化你的代码。 重写的代码可能没有正确的源映射,因此不能设置断点。

所以有两点build议:

  1. 要求调用不像常规语句。 它们更像Java中的导入语句,由编译器专门处理。 它们应该始终是节点文件中的顶层。
  2. 在Node中不需要将代码封装在匿名函数中。

我用相同的设置完全跑到相同的问题。

我已经添加了一个断点的目标函数的定义(这是唯一的地方,我实际上可以添加一个断点)。 当debugging器到达该断点,并且该函数被实际定义时,我能够将断点添加到实际的目标函数中。