7

使用节点检查器,我无法在以下 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 行设置断点,但是无论我多么努力,调试器都不会让我在第 5 行或第 9 行设置断点。要清楚,我正在使用以下命令运行节点检查器

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

我也尝试在网络风暴中进行调试,但问题仍然存在。如果我删除 line require('underscore');,那么问题会立即消失,我可以再次在函数体内设置断点。如果我删除最外层的闭包函数,问题也会消失。似乎require和文件级别关闭之间的交互正在搞砸节点调试功能。有没有人自己遇到过这个问题和/或知道任何解决方法可以破坏函数体?

编辑:我的节点 js 版本

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

2 回答 2

11

我使用相同的设置遇到了完全相同的问题。

我在目标函数的定义之后添加了一个断点(那是我唯一可以实际添加断点的地方)。当调试器到达该断点并实际定义函数时,我能够将断点添加到实际的目标函数......

于 2014-01-14T10:03:51.040 回答
3

这可能不是您想听到的答案,因为它没有解释为什么您不能设置任何断点,但我会简单地从闭包中删除您的 require 语句并将其置于顶层。我会更进一步,并建议您根本不要使用像上面那样的闭包。

原因是 node 使用自己的模块系统,并且与浏览器中的 Javascript 不同,将变量声明为顶层不会污染全局命名空间。这就是 require(...) 的用武之地。因此,通过将代码包装在立即调用的函数中,您将一无所获(当然,除非您希望您的模块能够同时运行客户端和服务器端)。

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

所以,有两个建议:

  1. 要求调用不像常规语句。它们更类似于 Java 中的 import 语句,并由编译器专门处理。它们应该始终位于节点文件的顶层。
  2. 在 Node.js 中无需将代码包装在匿名函数中。
于 2013-07-24T16:41:56.307 回答