如何以编程方式检测nodejs中的debugging模式?

我见过这个问题的其他平台/语言 – 任何想法? 我想要做一些事情:

if (detectDebug()) { require('tty').setRawMode(true); var stdin = process.openStdin(); stdin.on('keypress', function (chunk, key) { DoWork(); } } else { DoWork(); } 

我希望能够在debugging时能够将键盘input切换为脚本的开始,以便我可以有时刻启动chrome来听我的节点检查器端口。

***快速更新 – 我猜我实际上可以使用“process.argv”来检测–debug是否通过。这是最好的/正确的方式?

v8debug在debugging模式下运行时会创build一个v8debug全局对象: node debug script.js

所以,一个可能的解决scheme是:

 var debug = typeof v8debug === 'object'; 

对于我的用例,我使用它,因为我想避免传递环境variables。 我的主要节点进程启动子节点进程,我想要一个node debug mainScript.js触发debugging模式为子(以及不传递variables的subprocess)

当设置debug或–debug-brk命令行选项时,global.v8debug对象似乎只能被创build/暴露。 当–debug被设置的时候,它是不会被创build的。

这样做的一个怪事就是查看process.execArgv数组(不是process.argv)–debug,–debug-brk或debugging。

我觉得这个问题有一堆混乱。

基于你的问题,我认为你真正想要的是node --debug-brk命令行标志。 这将使节点启动v8并运行一个debugging程序,并在.js程序的第一行之前的断点处自动停止。 你不需要重塑这一点。 我用它来debugging摩卡testing,express.js启动问题等。这将消除您需要手动检测。

其次, NODE_ENV=production只不过是许多程序用来表示“你在生产中运行”的约定,因此应该启用真正发送电子邮件,使用真正的支付网关等某些东西。 然而,当NODE_ENV不生产(或未设置)时,你所处的环境绝对不应该被认为是在debugging。 最理智的假设是环境是一个发展的环境,但即使如此,整个公约也是非常脆弱的,我认为。

第三,仅供参考,请查看tty.isatty() ,它将准确地告诉您程序是否在交互式terminal上运行(如从命令行界面运行)。 当您的程序由您的操作系统提供的进程pipe理器(upstart,sysvinit等)运行时,这将是false 。 此检查通常用于在交互式和脚本模式之间切换命令行程序。 它并不完全完美无瑕,但在posix世界被广泛采用。

第四,从一些快速的实验v8debugv8debug global @Gabriel Petrovay表示似乎只在执行node debug script.js时设置,而在执行node --debug script.js时没有设置。 不知道这是为什么。 如果这样的事情是可靠的,这似乎是找出“在debugging模式下的这个V8实例”的最正确的方法。

 var detectDebug = function() { return process.env.NODE_ENV !== 'production'; }; 

在debugging模式下运行:

 $ node app.js 

以生产模式运行:

 $ NODE_ENV=production node app.js 

有些框架通过这种方式来识别生产模式。 请参阅express.js文档 。

我用这个

 var debug = typeof v8debug === 'object' || /--debug|--inspect/.test(process.execArgv.join(' ')); 

它支持--debug--debug-brk --inspect --debug-brk ,– --inspect--inspect=1234

process.debugPort似乎始终存在,并且默认为5858.检测程序是否使用--debug明确启动的唯一方法是检查process.execArgv数组。 --debug-brk是很明显的检测:你的程序不会做任何事情,你会得到一个关于debugging器听的消息,所以这是微不足道的。 当程序以node debug file.js v8debug启动时,或当像node-inspector这样的debugging器被连接时, v8debug似乎就存在了。

牢记这一切,这段代码将检测是否有一个debugging器(任何types)当前连接。

  var debug, withDebug; debug = false; if (typeof v8debug !== "undefined" && v8debug !== null) { console.log("v8 debug detected"); debug = true; } withDebug = process.execArgv.indexOf('--debug') > -1 || process.execArgv.indexOf('--debug-brk') > -1; if (withDebug) { console.log("started with debug flag, port: " + process.debugPort); debug = true; } if ((typeof v8debug === "undefined" || v8debug === null) && !withDebug) { console.log("neither detected"); } 
 Object.defineProperty(global, 'isDebugging', { get: function () { return typeof v8debug !== 'undefined'; } }); 

这适用于webstorm

在nodejs> = 7的版本中没有v8debug。 看来最简单的方法就是检查命令行参数。 在debugging模式下,会有一个词“debugging”或“检查”

 const argv = process.execArgv.join(); const isDebug = argv.includes('inspect') || argv.includes('debug');