【问题标题】:how do you debug a node.js app?你如何调试 node.js 应用程序?
【发布时间】:2012-03-20 06:34:45
【问题描述】:

我正在开发一个 node.js 应用程序,有时它似乎冻结了。我认为这是因为用户代码线程已冻结。它似乎在使用大约 5 分钟后发生,但我不知道为什么。是否有任何工具可以让您知道它在哪里陷入僵局?除了在每一行添加日志记录。

更新以添加更多信息....

我添加了一些跟踪语句并将其缩小到以下代码:

exports.addLocationToRoute = function(req, res) {
    console.log("27");
    console.log(req.body);

    var queryConfig = {
        text: "INSERT INTO route_locations (route_id, location_id, order_id) VALUES ($1, $2, $3);",
        values: [req.params.id, req.body.locationId, req.body.order]
    };

    pg.connect(conString, function(err, client) {
    console.log("28");
...

我在跟踪中看到 27 输出,但没有看到 28。有没有办法查看为什么它在这两点之间被冻结?

更新 2:

我只是试图再次重现,它在代码中的不同点被冻结,但此时它也在调用

pg.connect(conString, function(err, client) {

【问题讨论】:

  • 不是重复的。我特意询问如何在代码中找到它陷入僵局的位置。
  • 现在完全是另一个问题了。

标签: node.js


【解决方案1】:

我正在使用 JetBrains WebStorm IDE 进行 Javascript 开发。它具有完整的 Node 支持,这意味着您可以设置断点并跟踪您的代码。然而,WebStorm 不是免费的。 您还可以查看有关节点调试的旧主题: How do I debug Node.js applications?

有一个关于使用Chrome Development Tools 的公认答案,但我宁愿遵循更流行的答案,即使用node-inspector 进行调试。

【讨论】:

  • 任何 JetBrains IDE 都应该有 Node.js 插件。我使用 IntelliJ,它也一样
  • 那么,一旦它被冻结,你可以使用它来暂停它以找出它在调用堆栈中的位置吗?这不适用于 chrome 开发工具
  • 是的,您可以暂停,但不确定调用堆栈。如果没有要调用的回调,则暂停不会将您带到任何地方。 @j pimmel:是的,Idea 也不错,但成本更高。
【解决方案2】:

您可能希望将节点置于--debug 模式并使用node-inspector 对其进行分析。

当代码锁定在某个地方时,您可以使用暂停按钮 (http://pix.am/LYZz/) 暂停执行并检查堆栈跟踪以找到锁定。

【讨论】:

  • 我已经设置好了,但是如何使用它来找出它被锁定的位置?我不想添加断点,因为它大约每 5-10 分钟发生一次。单步执行代码,需要数小时才能重现。
  • 告诉它暂停异常。但是,根据您的更新,底层 PostgreSQL 服务器似乎正在拒绝您的连接(一次太多?)为什么您在每个查询上都打开新连接,而不是一遍又一遍地重用相同的连接?
  • 确定每个请求必须有一个连接,否则可能有两个请求同时使用同一个连接?
  • 查看Evented API。您创建一个查询并获取一个查询对象,然后对传入的结果执行回调。具有多个查询的单个连接(按提供给 PSQL 的顺序排列)。这比通过关闭和打开连接来敲击 PSQL 更好,这些连接只会给服务器带来压力,并且可能会在同时打开和关闭的连接数量上遇到错误(就像我怀疑你在这里一样)。
  • 嗯,我不同意你的观点,但是文档说回调样式比事件 api 更受欢迎
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多