【问题标题】:Why is process.debugPort defined when not debugging?为什么在不调试时定义了 process.debugPort?
【发布时间】:2020-12-03 04:05:32
【问题描述】:

我一直在探索各种方法来检测节点进程是否附加了调试器。我遇到了直截了当的process.debugPort,它被记录为:

process.debugPort

添加于:v0.7.2

启用时 Node.js 调试器使用的端口。

文档中的“启用时”是什么意思?或者更重要的是,什么时候没有启用调试器?一个简单的测试程序显示process.debugPort 似乎总是被定义。

'use strict'

const debugPort = process.debugPort
console.log(`debugPort: ${debugPort}`)

这是一些命令行输出,显示了它在节点 v10.22.1 中的调用——我测试了节点 v15.3.0 并观察到了相同的行为。

➜  node --version
v10.22.1
➜  node nodeDebug.js 
debugPort: 9229
➜  node --inspect=0.0.0.0:9999 nodeDebug.js
Debugger listening on ws://0.0.0.0:9999/db5cdb75-4745-4ea1-9a87-3f81c811c563
For help, see: https://nodejs.org/en/docs/inspector
debugPort: 9999

因此,即使在调用没有 --inspect 标志的节点时,也会定义 debugPort(并设置为默认值 9229)。


顺便说一句,我发现的检测节点是否处于调试模式的最佳方法是inspector.url() which

返回活动检查器的 URL,如果没有则返回 undefined。

我不确定这是否是防弹的,但它涵盖了我的用例。

【问题讨论】:

    标签: node.js debugging


    【解决方案1】:

    即使您在没有显式 --inspect 标志的情况下启动,也始终可以通过向进程发送 SIGUSR1 信号来临时启用检查器,如下所示:

    kill -SIGUSR1 $myNodePID
    

    因此,debugPort 属性总是设置为某个值是有道理的,因为它可能会很快被使用。

    请参阅here 的顶部以通过句子确认这一点。

    【讨论】:

    • 这是有道理的。我浏览了您昨天链接的调试器文档。但它没有回答是否可以禁用调试器,或者为什么debugPort 文档会暗示它可以被禁用。
    • 但它大部分时间都被禁用 - 并且在禁用时端口不用于侦听连接。虽然它总是有可能突然打开!这意味着必须始终设置指定用于侦听的端口的设置。 DebugPort 被设置(并且一直如此)并不意味着调试器此时实际上正在监听。
    • 另一种说法:调试器总是被初始化(如果不重新编译节点就无法回避),但通常不会打开
    • Node 进程能否在不主动监听连接的情况下保留端口?我假设不是,并且存在端口被不同进程占用的风险,但如果不是这种情况,那么它突然变得更有意义了。
    • 刚刚通过运行两个节点进程检查了这一点,如下所示:node -e 'setInterval(() => console.log(process.debugPort), 1000)',然后向每个进程发送 SIGUSR1 - 默认情况下它们都设置为使用 9229,如果打开了一个调试,则当您向其发送魔术信号时,其他将记录错误 - 端口未保留!
    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    相关资源
    最近更新 更多