如何以编程方式检测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世界被广泛采用。
第四,从一些快速的实验v8debug
, v8debug
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');