我已经看到这个问题涉及其他平台/语言 - 任何想法?我想做点什么:
if (detectDebug())
{
require('tty').setRawMode(true);
var stdin = process.openStdin();
stdin.on('keypress', function (chunk, key) {
DoWork();
}
}
else
{
DoWork();
}
我希望能够在调试时切换键盘输入作为脚本的开始,这样我就可以有时间启动chrome来监听我的node-inspector端口。
***快速更新 - 我猜我实际上可以使用“process.argv”来检测是否传入了--debug。这是最佳/正确的方法吗?
在调试模式下运行时,NodeJS会创建一个v8debug
全局对象:node debug script.js
因此,一个可能的解决方案是:
var debug = typeof v8debug === 'object';
对于我的用例,我使用它是因为我想避免传递环境变量。我的主节点进程启动子节点进程,我想要一个node debug mainScript.js
来触发子进程的调试模式(同样,不将env变量传递给子进程)
Object.defineProperty(global, 'isDebugging', {
get: function () {
return typeof v8debug !== 'undefined';
}
});
这适用于webstorm
我用这个
var debug = typeof v8debug === 'object'
|| /--debug|--inspect/.test(process.execArgv.join(' '));
支持,--debug
,--debug-brk
,--inspect
和--inspect=1234
我认为这个问题有很多混乱。
根据你的问题,我认为你真正想要的是node --debug-brk
命令行标志。这将使节点启动v8并运行调试器,并在.js
程序的第一行之前自动停在断点上。你不需要重新发明这个。我用它来调试mocha测试,express.js启动问题等。这将消除你手动检测它的需要。
其次,NODE_ENV=production
只不过是许多程序用来表示“你在生产中运行”的惯例,因此应该启用某些事情,如真正发送电子邮件,使用真实的支付网关等。但是,当NODE_ENV
不生产(或未设置)时,你所处的环境绝对不应该被认为是调试。最明智的假设是环境是一个开发环境,但即便如此,在我看来,整个惯例都非常脆弱。
第三,仅供参考,请查看tty.isatty(),它将准确地告诉您程序是否在交互式终端上运行(如命令shell)。当你的程序由你的操作系统提供的进程主管(upstart,sysvinit等)运行时,这将是false
。此检查通常用于在交互模式和脚本模式之间切换命令行程序。它并不完全完美或绝对可靠,但它在posix世界中被广泛采用。
第四,从一些快速的实验来看,v8debug
全球@Gabriel Petrovay指示似乎只在做node debug script.js
时设置,而不是在做node --debug script.js
时设置。不知道为什么会这样。如果这样的事情是可靠的,那么这似乎是找出“这是调试模式中的这个v8实例”的最正确的方法。
只有在设置了debug或--debug-brk命令行选项时,才会创建/公开global.v8debug对象。当设置--debug时,它不会被创建,这很奇怪而且很烦人。
一个hacky方法是查看process.execArgv数组(不是process.argv)--debug, - debug-brk或debug。
var detectDebug = function() {
return process.env.NODE_ENV !== 'production';
};
在调试模式下运行:
$ node app.js
在生产模式下运行:
$ NODE_ENV=production node app.js
一些框架以这种方式识别生产模式。见express.js doc。
process.debugPort
似乎总是存在并且默认为5858.检测程序是否使用--debug
明确启动的唯一方法是检查process.execArgv
数组。 --debug-brk
很明显可以检测到:你的程序不会做任何事情,你会得到一个关于调试器监听的消息,所以这很容易弄明白。当使用v8debug
启动程序或当前附加了类似node-inspector的调试器时,node debug file.js
似乎存在。
记住所有这些,此代码将检测当前是否附加了调试器(任何类型)。
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");
}
nodejs> = 7的版本中没有v8debug。似乎最简单的方法是检查命令行参数。在调试模式下,会有一个单词'debug'或'inspect'
const argv = process.execArgv.join();
const isDebug = argv.includes('inspect') || argv.includes('debug');
有一个node.js原生支持使用inspector.url()
来检查是否有活动的检查器,它只是显示进程是否是当前的调试模式。有关更多信息,请参阅doc。
有简单的解决方案是here。
但总的来说,检测调试模式并不容易 - https://github.com/nodejs/node/issues/9617